2011-07-19 10 views
4

私は長い間ずっと深刻な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); 
} 

答えて

8

あなたの人々の配列は、実際にはchar const *people[]です。リテラル文字列は、通常、多くのシステムでは読み取り専用メモリに格納されています。あなたはそれらに書くことはできません。どうやら、これはHP/UXでは当てはまりません。

+0

D'oh。私は今夜​​私のK&Rの本でカールします! – Tom

+0

@Rudy:技術的には、文字列リテラルは 'char *'のみであり、 'const'ではありません。ほとんどのコンパイラでは、それらを読み取り専用セグメントに配置しているため、書き込みしようとするとsegaultが発生します。この悪い振る舞いを許すコンパイラがあり、共有文字列リテラルに大きな問題を引き起こす可能性があります。この場合、 'people'を' people [1] [0] 'に書くときにコンパイル時の警告/エラーを生成するchar const *として定義することは良い考えです。 – tomlogic

+0

@tomlogic:ありがとう、ありがとう。 –

2

文字列リテラルは読み取り専用データセグメントにあります。それらに書き込もうとするとセグメンテーション違反になります。

0

文字列リテラルは変更できません。

+1

メモリセグメンテーションで可能ならば、好きなことをすることができます。 –

関連する問題