1

次のコードでは、コンパイル中にセグメンテーション違反が発生します。

(gdb) runプログラムの
開始: /home/anna/Desktop/a.out
プログラムはシグナル SIGSEGV を受信しました。セグメンテーション違反です。
/lib/i386-linux-gnu/libc.so.6 からの strtok () の 0xb7e97845

#include <string.h>
#include <stdio.h>

main () {
char * sentence = "This is a sentence.";
char * words[200] ;
words[0] = strtok(sentence," ");
}

5 行目を変更した後、エラーはスローされません。

#include <string.h>
#include <stdio.h>

main () {
char  sentence[] = "This is a sentence.";
char * words[200] ;
words[0] = strtok(sentence," ");
}

なぜこうなった?

4

2 に答える 2

6
char * sentence = "This is a sentence.";

sentence文字列リテラル「これは文です」を指すポインタです。読み取り専用メモリに格納されているため、変更しないでください。
文字列リテラルを何らかの方法で変更すると、未定義の動作が発生し、あなたの場合、セグメンテーション違反が発生します。

よく読んでください:
char a[] = ?string?; の違いは何ですか? および char *p = ?string?;?

于 2012-12-20T11:39:29.433 に答える
2

(バグセクション)のmanページを読んで、strtok

  • これらの関数は、最初の引数を変更します。
  • これらの関数は定数文字列では使用できません。

読み取り専用のコンテキストでchar *sentence = "This is a sentence";割り当てられるため、定数として扱われます。

于 2012-12-20T12:02:08.503 に答える