1

私はCプログラミングにかなり慣れていないので、文字列tを文字列sの最後に置く単純なプログラムを実行しようとしています:

#include <stdio.h>

void _strcat(char *s, char *t){
    for(;*s;s++);
    for(;(*s=*t)!='\0';s++,t++);

}

int main()
{
    char *s="hello";
    char *t="how are you?";

    _strcat(s,t);

    getchar();
    return 0;
}

しかし、(同じタイプの)2つのポインターを割り当てると、常に迷惑なエラーが*s=*t; 発生します。これはエラーです:

スレッド 1: EXC_BAD_ACCESS (コード 2、アドレス =.....)

4

1 に答える 1

7

文字列リテラルは読み取り専用であるため、これを変更しようとすると未定義の動作になります。それだけでなく、それらは文字列の正確なサイズ (プラス ターミネータの 1 つ) に過ぎないため、最初の文字列は追加される 2 番目の文字列に適合しないため、一部のメモリを上書きして、さらに未定義の動作を引き起こします。

追加する文字列は、両方の文字列に収まる大きさの配列として宣言する必要があります。たとえば、次のようにします。

char s[128] = "hello";

ポインターのみを使用してヒープに割り当てる方法:

char *s = malloc(128);
strcpy(s, "hello");

free使用後に割り当てられたメモリを忘れないでください。

于 2013-09-03T05:47:51.277 に答える