0

私が書いているより大きなプログラムで同様の問題を抱えているので、このコードを書きました。問題は同じだとわかっているので、この小さな例を作成しました。

#include <stdio.h>

typedef struct
{
    int x;
    char * val;
}my_struct;

int main()
{
    my_struct me = {4, " "};
    puts("Initialization works.");
    me.val[0] = 'a';
    puts("Assignment works.");
    puts(me.val);
    puts("Output works.");
    return 0;
}

tcc(Tiny Cコンパイラ)でコンパイルすると、正常にコンパイルおよび実行されます。しかし、GCC 4.6.0 20110513(プレリリース)を使用するとコンパイルされますが、実行すると「初期化作業」を通過するだけです。セグメンテーション違反を取得する前に。

私は何が間違っているのですか?それは私のコードですか、それとも私のGCCコンパイラですか?

4

3 に答える 3

8

あなたのコード。ANSIでは、文字列定数を読み取り専用にすることができます。これは、プログラムの実行中のすべてのインスタンス間で文字列定数をシステム全体で共有できることを意味するため、これをお勧めします。gccを指定しない限り-fwritable-stringstcc書き込み可能になります(おそらく、より簡単なためです)。

于 2011-06-04T19:02:54.380 に答える
0

val読み取り専用の場所のポイントです。

char *readOnly = "Data in read only location" ;

readOnlyポインティングデータは変更できません。

于 2011-06-04T19:04:15.117 に答える
0

他の回答が指摘しているようvalに、文字列定数を指しています。試す

my_struct me = {4, malloc(2)};

実際のプログラムでこれを使用しているかvalどうかを確認することを忘れないでください。NULL

于 2011-06-04T19:11:37.240 に答える