Cで本当に基本的なことを実行しようとしていますが、セグメンテーションエラーが発生し続けます。私がやりたいのは、Wordの文字を別の文字に置き換えることだけです。この例では、lをLに置き換えます。どこが間違っているのかを誰かが説明してもらえますか?それは本当に基本的な問題だと思いますが、なぜそれが機能しないのか分かりません。
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
char *string1;
string1 = "hello";
printf("string1 %s\n", string1);
printf("string1[2] %c\n", string1[2]);
string1[2] = 'L';
printf("string1 %s\n", string1);
return 0;
}
私の出力では、
string1こんにちは
string1 [2] l
セグメンテーション違反
ありがとう!
string1 = "hello"; string1[2] = 'L';
あなた 文字列リテラルを変更することはできません 、それは未定義の動作です。これを試して:
char string1[] = "hello";
または多分:
char *string1;
string1 = malloc(6); /* hello + 0-terminator */
strcpy(string1, "hello");
/* Stuff. */
free(string1);
char *string1;
string1 = "hello";
string1
は文字列リテラルを指し、文字列リテラルは変更できません。
あなたができることは、文字列リテラルの要素で配列を初期化することです。
char string1[] = "hello";
string1
配列の要素は変更可能です。
char *string1 = "hello";
コードを実行すると、文字列リテラルは読み取り専用のセクションになります。 OSはコードがそのメモリブロックを変更することを許可しないため、セグメンテーション違反が発生します。
char string1[] = "hello";
コードを実行すると、文字列リテラルがスタックにプッシュされます。
string1[2] = 'L';
cで未定義の動作である文字列リテラルを変更しようとしています。代わりにstring1[]="hello";
を使用してください。セグメンテーション違反は、リテラルがメモリの読み取り専用セクションに格納されている可能性があり、それに書き込もうとすると未定義が生成されるためです動作。