#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));
}
b[0]:4b[1]:3b[2]:2b[3]:116
Exited: ExitFailure 2
我得到了正确的答案。但是如Exited:ExitFailure 2那样获得异常。
这种使用memcpy复制数组数据的方法是错误的吗?
答案 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)
返回16
个2
个字符长,因此程序返回2
作为退出代码。
答案 2 :(得分:-1)
你的memcpy声明中有问题。
1)您应该将指针传递给您的数组,而不是将指针传递给指针 你的阵列。
2)你应该传递你的数组的大小,sizeof(a)将只返回int的大小,所以你必须 将它与数组的最大索引相乘。
您必须对代码进行少量修改,如下所示,
memcpy(b,a,sizeof(a)* 4);