gpt4 book ai didi

c - 为什么当你用字符串初始化一个没有 const 的数组时 gcc 不给出警告?

转载 作者:行者123 更新时间:2023-12-05 01:26:17 24 4
gpt4 key购买 nike

#include <stdio.h>

void print(char *strings[]) {
while (*strings) printf("%s\n", *strings++);
}

int main(int argc, char *argv[]) {

char *array[] = {"Hello", "World", NULL}; // No warning?
const char *constArray[] = {"Hello", "World", NULL};

print(constArray); // Warning!

//constArray[0][0] = '!'; Compile time error
array[0][0] = '!'; // Run time error

return 0;
}

我期望在 char *array[] = {"Hello", "World", NULL}; 中收到警告,因为这些字符串的字符是只读的,但编译器确实不要给我警告。所以基本上编译器让我在没有警告的情况下将 const char“转换”为 char a。

当将 const char 传递给在 print(constArray); 中接收 char 的函数时,换句话说,“转换” const charchar 编译器确实会给我一个警告。我希望编译器在两种情况下都给我一个警告,或者在两种情况下都不会给我警告,但在一种情况下不会,在另一种情况下不会。

我认为这个警告很重要,可以帮助防止 array[0][0] = '!'; 中的错误。那么为什么我在第一次初始化时没有收到警告?

最佳答案

So why I don't get a warning in the first initialization?

因为字符串文字的类型是 char 数组,而不是 const char 数组,尽管修改此类数组的元素会产生未定义的行为。这源于 C 语言的最初几天,当时还没有 const。我敢肯定它在现代 C 中的持久性是围绕着如果类型发生变化会出现的不兼容的程度和范围。

然而,对于个别程序,GCC 可以帮助您。如果你打开它的 -Wwrite-strings 选项那么它确实会给出字符串文字类型 const char [length ],结果是您提出的构造将引发警告。

关于c - 为什么当你用字符串初始化一个没有 const 的数组时 gcc 不给出警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39949341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com