3
#include <stdio.h>

int main(){
    int a[4];
    int b[4],i;
    a[0] = 4;
    a[1] = 3;
    a[2] = 2;
    a[3] = 1;
    memcpy(&b, &a, sizeof(a));
    for (i = 0; i < 4; i++){
        printf("b[%d]:%d",i,b[i]);
    }
    printf("%d",sizeof(b));
}

ANS:

b[0]:4b[1]:3b[2]:2b[3]:116
Exited: ExitFailure 2

正解です。ただし、Exitedとして例外が発生します:ExitFailure2。

memcpyを使用して配列データをコピーするこの方法は間違っていますか?

4

3 に答える 3

6

return 0;の最後にa を追加してみてくださいmain()

戻り値を省略すると、関数がスタック ガベージを返す可能性があります。(それは 0 ではありません)

したがって、ゼロ以外の戻り値を確認すると、テスト アプリ/スクリプトは失敗を訴えます。


C99 より前では、returnステートメントの省略は技術的に未定義の動作です。C990以降は省略時のデフォルトとなります。

詳細はこちら: main がここで 0 を返さないのはなぜですか?

于 2012-07-13T08:48:06.190 に答える
4

修正:

return 0;明示的に 0 ( ) を返さないと、undefined behaviourより前になりC99ます。

ただし、特定のレジスタは通常、関数からの戻り値 (たとえば ) を格納するために使用されるためeaxx86そのレジスタの値が返されます。

たまたま、関数から値を返すために使用される同じレジスタに配列printf("%d",sizeof(b));のサイズを格納しています。char

このため、戻り値は2です。

元の答え:

main の最後に記述していないためreturn 0;、最後のprintf呼び出しが main の戻り値として解釈されます。

sizeof(b)16文字の長さを返す2ため、プログラムは2終了コードとして戻ります。

于 2012-07-13T08:52:43.333 に答える
-1

memcpy ステートメントに問題があります。

1)配列のポインターにポインターを渡す代わりに、ポインターを配列に渡す必要があり
ます。

2)配列のサイズを渡す必要があります。sizeof(a)はintのサイズのみを返すため、配列の最大インデックスで乗算する必要があります。

以下に示すように、コードを少し変更する必要があります。

memcpy(b, a, sizeof(a) * 4);

于 2012-07-13T10:45:32.163 に答える