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

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));
}

答案:

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

我得到了正确的答案。但是报出了异常 Exited: ExitFailure 2。

使用memcpy复制数组数据的方式是否有误?


8
请在结尾处添加return 0; - Mysticial
4
你在这里使用memcpy有些错误,你不需要取地址符(&),因为数组类型与指针类型相容,所以memcpy(b, a, sizeof(a));就足够了。 - Some programmer dude
你说得对。我是在codepad.org上执行的。所以我没有收到缺少返回值的错误消息。 - Angus
但是使用&作为类型数组也会给我一个数组的地址。 - Angus
3
对于数组,& 是可选的。我通常会省略它。但是对于指针,情况显然不同。 - Mysticial
3个回答

6
尝试在main()的结尾添加return 0;
省略返回值可能会导致函数返回堆栈垃圾(而不是0),因此测试应用程序/脚本在看到非零返回值时会报告失败。
在C99之前,省略return语句在技术上是未定义行为。从C99开始,如果省略,则默认为0
更多细节请参见:Why main does not return 0 here?

1
这可能不是堆栈垃圾,而是最后一个 printf 的返回值,即 2。 - Daniel Fischer
是的,假设相同的寄存器/堆栈位置保留了从printf()返回的返回值。在x86和x64上都是如此。 - Mysticial

4

更正:

C99之前,不明确返回0(return 0;)会导致未定义的行为(undefined behaviour)

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

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

因此,返回值为2

原始答案:

由于您没有在主函数末尾声明return 0;,因此最后的printf调用被解释为main的返回值。

sizeof(b)返回16,长度为2个字符,因此程序以退出码2返回。


这是不正确的。在这种情况下,返回代码未定义。但在大多数情况下,返回值存储在寄存器中。因此,退出主函数时会保留printf返回值(寄存器)的旧值。 - Dmitry Poroh
你的意思是 printf 的值恰好存储在 %rax 中(例如在 x86 上),这就是为什么它在这种情况下返回 2 的原因? - Man of One Way

-1

你的memcpy语句存在问题。

1)你应该传递指向数组的指针,而不是传递指向指针的指针。
2)你应该传递数组的大小,sizeof(a)只会返回int的大小,所以你需要将其乘以数组的最大索引。

你需要对代码进行一些小修改,如下所示:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接