5
#include<string.h>
#include<stdio.h>
void main()
{
    char *str1="hello";
    char *str2="world";
    strcat(str2,str1);
    printf("%s",str2);
}

このプログラムを実行すると、ランタイム プログラムが終了します。

私を助けてください。

私がこれを使用する場合:

char str1[]="hello";
char str2[]="world";

それは働いています!

しかし、なぜ

char *str1="hello";
char *str2="world";

このコードは機能していません????

4

6 に答える 6

1
char *srt1="hello";
char *srt2="world";

このように文字列を宣言すると、読み取り専用メモリに格納されます!

読み取り専用メモリに保存されている変数は変更できません!

これを行うstrcatと、読み取り専用メモリに存在する文字列を変更しようとします。だからここは禁止!「未定」です。

于 2014-08-26T09:24:27.033 に答える
1

文字列リテラルは読み取り専用で、変更できません。

これ:

char *srt2="world";

(悪い名前、btw) は、定数データ(および終了文字)srt2を含むメモリを指すポインター変数を意味します。6 文字の後に追加のスペースはなく、文字を変更することさえできません。"world"'\0'

必要なもの:

char str2[32] = "world";

一方、これstr2は 32 文字の配列になり、最初の 6 文字は に初期化され"world"、終了します'\0'。新しい文字は既存の配列に収まる可能性があるため、これに追加しても問題ありません。ただし、オーバーステップして 32 文字を超える文字 (ターミネーターを含む) を格納しようとしない限りは問題ありません。

于 2014-08-26T09:29:24.147 に答える
0

あなたのプログラムでは、str1 と str2 は読み取り専用メモリへのポインターとして宣言されているため、書き込まれることは想定されていません。これを確認するには、「objdump -s a.out」を実行すると、次のように表示されます。

Contents of section .rodata:
400640 01000200 68656c6c 6f00776f 726c6400  ....hello.world.
400650 257300                               %s.    

strcat はメモリのその部分に書き込もうとするため、セグメンテーション フォールトが発生します。

于 2014-08-26T09:35:45.373 に答える