12
int main()
{
        char *x = "HelloWorld";
        char y[] = "HelloWorld";

        x[0] = 'Z';
        //y[0] = 'M';

        return 0;
}

上記のプログラムでHelloWorldは、読み取り専用セクション (文字列テーブル) になります。xその読み取り専用セクションを指しているため、その値を変更しようとすると未定義の動作になります。

ただしy、スタックに割り当てられ、HelloWorldそのメモリにコピーされます。したがって、y を変更しても問題なく動作します。文字列リテラル: ポインターと char 配列

これが私の質問です:

次のプログラムでは、コンテンツが変更されると、 と の両方char *arrchar arr[]セグメンテーション違反が発生します。

void function(char arr[])
//void function(char *arr)
{
   arr[0] = 'X';
}        
int main()
{
   function("MyString");    
   return 0;
}
  1. 関数パラメーターのコンテキストでどのように異なりますか?
  2. 関数パラメーターにメモリが割り当てられませんか??

あなたの知識を共有してください。

4

3 に答える 3

25

関数のパラメーター リスト内でchar arr[]は、 と完全に同等char *arrであるため、定義のペアと宣言のペアは同等です。

void function(char arr[]) { ... }
void function(char *arr)  { ... }

void function(char arr[]);
void function(char *arr);

問題は呼び出しコンテキストです。関数に文字列リテラルを指定しました。文字列リテラルは変更できません。関数は、指定された文字列リテラルを変更しようとしました。プログラムが未定義の動作を呼び出してクラッシュしました。すべて完全にコーシャです。

文字列リテラルをあたかもそうであるかのように扱い、それらstatic const char literal[] = "string literal";を変更しようとしないでください。

于 2013-06-14T14:48:17.400 に答える