这会产生gcc警告吗?

Ked*_*ade 2 c arrays string pointers compiler-warnings

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

char amessage[] = "a message"; /* an array */
char *pmessage = amessage; /* a pointer */
Run Code Online (Sandbox Code Playgroud)

amessage是一个大到足以容纳字符序列的数组,'\ 0'用于初始化它.可以更改阵列中的单个字符,但是消息将始终引用相同的存储.OTOH,pmessage是一个指针,初始化为指向一个字符串常量; 随后可以修改指针以指向别处; 但如果您尝试修改字符串内容,结果将是未定义的.

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

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

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

das*_*ght 5

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

例如,考虑一段代码,其中指针最初指向可修改内存块,然后稍微操作它,然后将其指定为指向字符串文字:

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
Run Code Online (Sandbox Code Playgroud)

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