0

私はこのような配列を持っていchar *ます:

char * gradient_xpm[] = {"abc", "def", "ghi"};

これらの文字列の値を変更する必要があります。

オペレーターを試してみましstrcpy=が、セグメンテーション違反が発生します。

例えば:

strcpy(gradient_xpm[1],"jkl");
gradient_xpm[1][2] = 'x';

1文字も編集できませんでした。これらの値を編集するにはどうすればよいですか?

4

5 に答える 5

4

配列に文字列定数があり、それらを変更することはできません。これがセグメンテーション違反の原因です。

文字列定数を使用せずに配列をセットアップしてから、文字列定数を配列にコピーする必要があります。

何かのようなもの:

char *gradient_xpm[3];

gradient_xpm[1] = (char *) malloc(sizeof(char) * (MAX_STR_LEN + 1));
strncpy(gradient_xpm, "jkl", MAX_STR_LEN);

// now this will work:
gradient_xpm[1][2] = 'x';

gradient_xpm[0]、についても同様ですgradient_xpm[2]

于 2012-06-15T21:11:06.873 に答える
3

C での文字列リテラルの変更は未定義の動作です。そのため、必ずしもセグメンテーション違反ではなく、何でも発生する可能性があります。

C99 標準6.4.5 文字列リテラル 6.4.5/6から:

これらの配列の要素が適切な値を持っている場合、これらの配列が異なるかどうかは指定されていません。プログラムがそのような配列を変更しようとした場合、動作は未定義です。

于 2012-06-15T21:20:31.843 に答える
1

立ち入り禁止としてマークされている文字列定数は変更できません。ただし、ヒープまたはスタックに割り当てたメモリは変更できます。とはいえ、C++ を使用している場合は、配列を管理する代わりにstringclasschar *の配列を使用することを検討してください。メモリ管理の問題は、はるかに簡単に処理できます。

于 2012-06-15T21:15:09.423 に答える
0

文字列リテラルを使用してこれを実装しましたが、それらを変更することはできません

于 2012-06-15T21:13:48.183 に答える
0

内容を編集しないでください - それは悪い、悪い考えです。const char *一部のコンパイラでは、文字列定数はではなく であるため、これはコンパイル時エラーになりますchar*

代わりに、ポインターを反転します。

gradient_xpm[1] = "jkl"; 
于 2012-06-15T21:14:38.467 に答える