使用memcpy将数据复制到数组中

时间:2012-07-13 08:40:31

标签: c

#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:ExitFailure 2那样获得异常。

这种使用memcpy复制数组数据的方法是错误的吗?

3 个答案:

答案 0 :(得分:6)

尝试在return 0;的末尾添加main()

省略返回值可能导致函数返回堆栈垃圾。 (那不是0)

因此,测试应用/脚本在看到非零返回值时会抱怨失败。


在C99之前,省略return语句在技术上是未定义的行为。从C99开始,如果省略它将默认为0

此处有更多详情:Why main does not return 0 here?

答案 1 :(得分:4)

<强>校正:

return 0;之前未明确返回0(undefined behaviour)导致C99

但是,由于特定寄存器通常用于存储函数中的返回值(例如eax中的x86),因此返回该寄存器中的值。

恰好是printf("%d",sizeof(b));char数组的大小存储在用于从函数返回值的同一寄存器中。

因此,返回的值为2

原始回答:

由于您未在main的末尾声明return 0;,因此最后一次printf调用被解释为main的返回值。

sizeof(b)返回162个字符长,因此程序返回2作为退出代码。

答案 2 :(得分:-1)

你的memcpy声明中有问题。

1)您应该将指针传递给您的数组,而不是将指针传递给指针    你的阵列。

2)你应该传递你的数组的大小,sizeof(a)将只返回int的大小,所以你必须    将它与数组的最大索引相乘。

您必须对代码进行少量修改,如下所示,

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