gpt4 book ai didi

c - 这应该产生 gcc 警告吗?

转载 作者:行者123 更新时间:2023-12-02 07:35:10 25 4
gpt4 key购买 nike

K&R C(第二版,第 5.5 节)陈述如下(由我强调):

char amessage[] = "a message"; /* an array */
char *pmessage = amessage; /* a pointer */

amessage is an array just big enough to hold the sequence of characters and '\0' that initializes it. Individual characters within the array may be changed but amessage will always refer to the same storage. OTOH, pmessage is a pointer, initialized to point to a string constant; the pointer may subsequently be modified to point elsewhere; but the result is undefined if you try to modify the string contents.

现在,我的问题是,在使用 -Wall 编译以下程序时,我的 Linux 机器上的 gcc 4.6.1(或 c99)是否应该生成警告:

int main(void) {
char amessage[] = "a message";
char *pmessage = "a message";
pmessage[0] = 'b';
return 0;
}

(我发现 gcc 不会产生警告。我的期望是,如果我正确地解释了上述内容,它应该会产生警告。)

最佳答案

虽然您从 K&R 引用的是正确的,但我不希望这段代码产生警告,因为在一般情况下很难跟踪此类错误。

例如,考虑一段代码,其中您的指针最初指向一 block 可修改的内存,然后您对其进行一些操作,然后将其分配给指向一个字符串文字:

char [] ok = "quick brown fox";
char *ptr = ok;
for (int i = 0 ; i != 5 ; i++) {
*ptr++ = '-'; // OK
}
ptr = "jumps over the lazy dog";
ptr[0] = 'J'; // Bad

对于编译器来说,跟踪这些赋值并发出警告是非常棘手的。涵盖所有情况是不可能的,因为指向字符串文字的指针可能来自外部链接函数。

关于c - 这应该产生 gcc 警告吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309844/

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