コードは自明ですが、セグメンテーション違反が発生します。なぜですか?:\
#include <stdio.h>
int main(void)
{
char *c = "Hella";
*(c+4) = 'o';
printf("%s\n",c);
}
コードは自明ですが、セグメンテーション違反が発生します。なぜですか?:\
#include <stdio.h>
int main(void)
{
char *c = "Hella";
*(c+4) = 'o';
printf("%s\n",c);
}
それを回避する方法は?
文字列リテラルを変更しないでください!
char *c = "Hella";
c
実装定義の読み取り専用メモリに格納されている文字列リテラル「Hella」へのポインタを宣言します。
このリテラルを変更することは許可されていません。そうしようとすると、未定義動作になります。
プログラムがクラッシュするのは幸運です。未定義動作が常にクラッシュするわけではありませんが、プログラムが何らかの形で奇妙な動作をする可能性があります。
ここで必要なのは配列です。
char c[] = "Hella";
スタックに割り当てられた配列に文字列を配置します。
char c[] = "Hella";
前述のように、文字列リテラルは通常読み取り専用であるためです。
それを作成する方法はc
、文字列リテラルを指します。内容を変更することはできません。その使用を可能にしたい場合:
char c[6] = "Hella";
c[4] = o;
または、動的に割り当てられたchar配列を使用します。
リテラルを上書きしようとしています。本当にあなたのコードは読むべきです:
const char *c = "Hella";
何が起こっているのか説明します。
自分のメモリを上書きするには:
char c[] = "Hella";
より安全です。
コードで定義されている文字列を変更することはできません。それらを変更する場合は、strdupを使用してください。
#include <stdio.h>
int main(void)
{
char *c = strdup("Hella");
*(c+4) = 'o';
printf("%s\n",c);
free(c);
}