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

我得到了正确的答案。但是得到一个异常退出:ExitFailure 2。

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

4

3 回答 3

6

尝试return 0;main().

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

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


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

更多细节在这里:为什么 main 在这里不返回 0?

于 2012-07-13T08:48:06.190 回答
4

更正:

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

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

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

因此,返回值为2.

原答案:

由于您没有return 0;在 main 的末尾声明,因此最后一次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 回答