4

重複の可能性:
文字列への書き込み時にセグメンテーション違反が発生するのはなぜですか?

Cコードで奇妙な問題が発生しています。strtok関数を使用して文字列を分割しようとしていますが、アクセス違反の例外が発生します。これが私のコードです:

char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";
token = strtok(line, search); <-- this code causes crash

ただし、に変更char *lineするとchar line[]、すべてが期待どおりに機能し、エラーは発生しません。

なぜ私がstrtokでその(私にとって奇妙な)振る舞いをするのか誰でも説明できますか?char*とchar[]は同じタイプで正確だと思いました。

アップデート

MSVC2012コンパイラを使用しています。

4

4 に答える 4

8

strtok()解析する文字列を変更します。使用する場合:

char* line = "...";

次に、文字列リテラルが変更されますが、これは未定義の動作です。使用する場合:

char[] line = "...";

次に、文字列リテラルのコピーが変更されています。

于 2012-11-28T14:19:51.267 に答える
5

に割り当てるとき"LINE TO BE SEPARATED"は、プログラム実行可能ファイルに記述された定数文字列char *lineをポイントします。line変更することはできません。これらの種類の変数をとして宣言する必要がありますconst char *

として宣言されるchar[]と、文字列は関数のスタックで宣言されます。したがって、それを変更することができます。

于 2012-11-28T14:20:06.133 に答える
3
char *s = "any string"

文字列または文字の配列を指すポインタの定義です。上記の例sでは、定数文字列を指しています

char s[] = "any string"

char(s)の配列の定義です。上記の例sでは、文字を含む文字の配列です{'a','n','y',' ','s','t','r,'i','n','g','\0'}

strtock入力文字列の内容を変更します。文字列内のデリミエーターを'\0'(null)に置き換えます。

strtokしたがって、次のような定数文字列では使用できません。

char *s="any string"

次のような動的メモリまたは静的メモリでstrtokを使用できます。

char *s = malloc(20 * sizeof(char)); //dynamic allocation for string
strcpy(s,"any string");


char s[20] = "any string"; //static allocation for string
char s[] = "any string"; //static allocation for string
于 2012-11-28T14:20:17.610 に答える
1

あなたの質問に答えるには:char* and char[] are not same type?

これ:

char *line = "LINE TO BE SEPARATED";

読み取り専用メモリで定義された文字列リテラルです。この文字列は変更できません。

ただし、これは次のとおりです。

char line[] = "LINE TO BE SEPARATED";

これで、スタックに配置された文字配列(引用符で囲まれたテキストが配列にコピーされました)になりました。この配列の文字を変更できます。

したがって、これらは両方とも文字配列ですが、メモリの異なる部分に配置されます。

于 2012-11-28T14:25:30.523 に答える