0

コードは自明ですが、セグメンテーション違反が発生します。なぜですか?:\

#include <stdio.h>
int main(void)
{
    char *c = "Hella";
    *(c+4) = 'o';
    printf("%s\n",c);
}
4

5 に答える 5

9

それを回避する方法は?

文字列リテラルを変更しないでください!

char *c = "Hella";

c実装定義の読み取り専用メモリに格納されている文字列リテラル「Hella」へのポインタを宣言します。
このリテラルを変更することは許可されていません。そうしようとすると、未定義動作になります。

プログラムがクラッシュするのは幸運です。未定義動作が常にクラッシュするわけではありませんが、プログラムが何らかの形で奇妙な動作をする可能性があります。

ここで必要なのは配列です。

char c[] = "Hella";

良い読み物:
char a [] =?string ?;の違いは何ですか?およびchar*p =?string?;?

于 2013-01-09T16:08:07.103 に答える
1

スタックに割り当てられた配列に文字列を配置します。

char c[] = "Hella";

前述のように、文字列リテラルは通常読み取り専用であるためです。

于 2013-01-09T16:09:25.587 に答える
0

それを作成する方法はc、文字列リテラルを指します。内容を変更することはできません。その使用を可能にしたい場合:

char c[6] = "Hella";
c[4] = o;

または、動的に割り当てられたchar配列を使用します。

于 2013-01-09T16:08:43.050 に答える
0

リテラルを上書きしようとしています。本当にあなたのコードは読むべきです:

const char *c = "Hella";

何が起こっているのか説明します。

自分のメモリを上書きするには:

char c[] = "Hella";

より安全です。

于 2013-01-09T16:09:17.433 に答える
0

コードで定義されている文字列を変更することはできません。それらを変更する場合は、strdupを使用してください。

#include <stdio.h>
int main(void)
{
    char *c = strdup("Hella");
    *(c+4) = 'o';
    printf("%s\n",c);
    free(c);
}
于 2013-01-09T16:09:21.210 に答える