4
文字列を変更する小さな関数foo
を書きました。セグメンテーションエラー初期化メソッドに依存するSIGSEGV
この機能を使用すると、SIGSEGVフォルトが発生することがあります。これは、文字列の初期化方法に依存します。呼び出し関数main
では、文字列はメモリ割り当てとstrcpy
を呼び出して初期化されます。私はその文字列を正しく変更することができます。
他の文字列(TestString2
)は、変数を宣言すると初期化されます。私はこの文字列をトリミングすることはできませんが、SIGSEGVフォルトを取得します。
これはなぜですか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void foo(char *Expr)
{
*Expr = 'a';
}
int main()
{
char *TestString1;
char *TestString2 = "test ";
TestString1 = malloc (sizeof(char) * 100);
strcpy(TestString1, "test ");
foo(TestString1);
foo(TestString2);
return 0;
}
Cには文字列型がありません。ポインタは配列ではありません! – Olaf
@xing、Re "* TestString2は文字列リテラルを指します*"、いいえ、文字列を指します。文字列(https://en.wikipedia.org/wiki/Literal_(computer_programming))は、文字列を表すソースコードです。 – ikegami