0

いくつかのコードをテストするために、C で次のプログラムを作成しました。

int main(int argc, char *argv[])
{
    char *a = "hello ";
    char *b = "there";
    char *c = malloc(100);
    strcat(c, a); 
    strcat(c, b); 
    printf("length of a is %d\n", strlen(a));
    printf("length of concatenated string is %d\n", strlen(c));
    return 0;
}

これの出力は次のとおりです。

length of a is 6
length of concatenated string is 11

malloc を実行する代わりに、次のようにしました (残りのコードは同じです)。

char c[100];

出力は次のように変わります。

length of a is 6
length of concatenated string is 12

char 配列にポインターを使用すると、連結された文字列のサイズが変わる理由がわかりません。

4

3 に答える 3

3

両方の例の動作は未定義です。 strcatは、ソース文字列内の終了ヌルの後にデータを追加します。 cは初期化されていないため、nul ターミネータが含まれる場所 (およびその場合) は未定義です。

次のように使用するように変更すると、一貫した結果が得られstrcpyますstrcat

strcpy(c, a); 
strcat(c, b);
于 2013-03-08T16:15:41.020 に答える
3

cを呼び出した後に何も入れなかったのでmalloc、 の呼び出しはstrcat未定義の動作につながります。これは、割り当てられたメモリ ブロックに null ターミネータがまったく含まれていない可能性があるためです。この場合、strcat最終的にターミネータの検索中に、割り当てられたブロックを超えてメモリにアクセスします。

これにより、呼び出しの一貫性が保たれます。

char *c = malloc(100);
*c = '\0';
于 2013-03-08T16:15:09.270 に答える
1

calloc を使用して c の要素を 0 に初期化します。それ以外の場合は、strcat の最初の呼び出しの前に初期化されたままになり、結果は未定義になります。あなたのように初期化されていない変数を使用すると、未定義の動作が呼び出され、これは決して良いことではありません。

于 2013-03-08T16:16:05.043 に答える