私は長い間ずっと深刻なCをやっておらず、簡単な説明をいただければ幸いです。次のコードは、HP/UXでコンパイルして正常に動作します。これは、UbuntuのGCC 4.3.2(gcc -Wallの場合でも)では警告なしでコンパイルされますが、Linuxで実行される場合はsegfaultsです。シンプルなCコードはHPUXではうまく動作しますが、Linuxではsegfaultsです。どうして?
誰でも理由を説明できますか?
#include <stdio.h>
int main() {
char *people[] = { "Abigail", "Bob" };
printf("First: '%s'\n", people[0]);
printf("Second: '%s'\n", people[1]);
/* this segfaults on Linux but works OK on HP/UX */
people[1][0] = 'R';
printf("First: '%s'\n",people[0]);
return(0);
}
D'oh。私は今夜私のK&Rの本でカールします! – Tom
@Rudy:技術的には、文字列リテラルは 'char *'のみであり、 'const'ではありません。ほとんどのコンパイラでは、それらを読み取り専用セグメントに配置しているため、書き込みしようとするとsegaultが発生します。この悪い振る舞いを許すコンパイラがあり、共有文字列リテラルに大きな問題を引き起こす可能性があります。この場合、 'people'を' people [1] [0] 'に書くときにコンパイル時の警告/エラーを生成するchar const *として定義することは良い考えです。 – tomlogic
@tomlogic:ありがとう、ありがとう。 –