C语言指针数组相关问题

#询问下我使用指针数组时出现的warning是什么?可以编译运行成功,但是会显示warning
waring如图所示

img

#include
#include
#include





int main()
{    
    int n;
    printf("请输入月份数字");
    scanf("%d",&n); 
    char *a[13]={"january","february","march","april","may","june","july","august","september","october","november","december"};
    printf("%s",a[n-1]);
    printf("%s",*(a+n-1));
    
    
    return 0;
    
        
    
    
}    

常量字符串转换为字符串的警告,可以不用理会,没啥问题
可以将14行改为const char * a[13],因为后面的字符串都是常量字符串

参考GPT和自己的思路:

这个warning的意思是在将指针数组a和(n-1)相加之后,得到的是指针类型 (char ),而不是数组类型 (char [n])。因为指针和整数的相加是未定义行为,如果将其用于访问数组元素可能会导致程序出现错误。为了避免这种情况,可以将两个操作分开,使用a[n-1]或者(a+n-1)来访问数组元素。

因为指针和整数相加时的warning属于编译器的检查,可以忽略,程序可以正常运行。不过建议在使用指针数组时避免这种用法,以免出现潜在的错误。

这个 warning 的意思是,您将一个字符串常量转换成了 char* 类型的指针,这种做法已经被废弃了。原因是字符串常量实际上是只读的,不能通过指针修改它们的值,如果您试图修改它们的值,会导致未定义的行为。

警告信息的具体内容可能会有所不同,但是大致都是这个意思。例如,下面这段代码就会产生类似的 warning:

char* str = "hello";
str[0] = 'H'; // 尝试修改字符串常量,会导致未定义的行为

为了避免这个 warning,您可以将字符串常量声明为 const char* 类型的指针,这样就明确了它是只读的。例如:

const char* str = "hello";

如果您需要修改字符串的值,可以使用 char 数组来代替字符串常量。例如:


char str[] = "hello";
str[0] = 'H'; // 可以修改数组中的值

因为数组a的类型是个指针数组
而给它赋值的是字符串常量
这会导致当你操作指针的时候无法操作,是只读的
所以会有个警告

该回答引用GPTᴼᴾᴱᴺᴬᴵ
您好,这个警告是因为在您的代码中,您定义了一个指针数组 char a[13],并初始化了它的元素为字符串常量,例如 "january","february" 等。然而,在 C 语言中,字符串常量是不可变的,也就是说,您不能通过指针数组中的元素来修改这些字符串。
·
因此,编译器会发出警告,提醒您在将字符串常量赋值给指针时应该使用 const char
类型而不是 char* 类型,避免对字符串常量进行非法修改。
·
要消除这个警告,您可以将指针数组中的元素类型改为 const char,即 const char a[13]={"january","february","march","april","may","june","july","august","september","october","november","december"};。
·
修改后的代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
 
 
int main()
{    
    int n;
    printf("请输入月份数字");
    scanf("%d",&n); 
    const char *a[13]={"january","february","march","april","may","june","july","august","september","october","november","december"};
    printf("%s",a[n-1]);
    printf("%s",*(a+n-1));
    
    return 0;
} 


希望能帮到您!