1

我有一个整数数组:

 int num[20] = {1,1,5,5,1,1,5,9,2,2,6,1,1,2,5,5,1,3,6,2};

我想将元素复制num到以下结构中:

struct tuple
{
int p1;
int p2;
int p3;
int p4;
};

我正在执行以下操作:

struct tuple *arr;
memcpy(&arr,&num,sizeof(num));

这似乎不起作用,因为我稍后在代码中遇到了分段错误。当我尝试打印尺寸时:

printf("size of arr: %lu, size of arr[0]: %lu \n", sizeof(arr), sizeof(arr[0]));

我得到以下信息:

size of arr: 8, size of arr[0]: 16

这是错误的,因为这些值应该是:

size of arr: 80, size of arr[0]: 16

因此,当我尝试打印时,它会出现错误:

for (i=0;i<sizeof(arr)/sizeof(arr[0]);++i)
    printf("%d,%d,%d,%d\n", arr[i].p1,arr[i].p2, arr[i].p3, arr[i].p4);

有人可以帮助我了解我可能出错的地方吗?

4

2 回答 2

3

这里要说明几点。首先:

struct tuple *arr;
memcpy(&arr,&num,sizeof(num));

arr是指向 a的指针struct tuple;它不是 a struct tuple,它的大小是系统上的指针大小(可能是 8 个字节),与 a 的大小不同struct tuple。当您执行 时memcpy,它会复制指向 的指针struct tuple,而不是struct tuple实例。

其次,如果你打算复制到struct tuple这样的:

struct tuple aTuple;
memcpy(&aTuple,&num,sizeof(num));

然后,您将拥有 a 的实际实例,struct tuple而不仅仅是指针,并且 memcpy 将复制到该内存。但这仍然是错误的,因为:

1) 数组的大小远大于 的大小struct tuple,并且

2) 不保证结构的所有字段在内存中都是相邻的。p1和之间可以有填充p2等,因此结构和数组在内存中的排列方式会有所不同,并且不能直接复制。

顺便说一句,这适用于 memcpy 到 a struct tuple

struct tuple aTuple;
aTuple.p1 = aTuple.p2 = aTuple.p3 = aTuple.p4 = 42;
struct tuple anotherTuple;
memcpy(&anotherTuple,&aTuple,sizeof(struct tuple));

我仅将其发布为正确使用的示例。

编辑:

另一件事,关于这个:

printf("size of arr: %lu, size of arr[0]: %lu \n", sizeof(arr), sizeof(arr[0]));

您是否作为参数传递num给另一个函数arr?在这种情况下,arr它也是一个指针,其大小是 8 而不是 80。当您将数组传递给函数时,它作为指针传递。

于 2013-05-31T22:43:33.703 回答
0

尝试替换struct tuple *arr;struct tuple arr[5];或者struct tuple arr[sizeof(num)/sizeof(struct tuple)];. 当您声明arr为指针时,它不会为它指向的数组分配任何空间。当您将其声明为数组时,它将衰减为memcpy调用中的一个指针,并将 int 数组 blit 到堆栈(或静态)分配的结构数组的顶部。

arr或者,您可以使用对 的调用进行初始化malloc(sizeof(num)),但请确保将此类调用与对 的调用相匹配free()

此外,正如评论所指出的,您需要传递arrandnum而不是&arrand &num。您想要复制数据,而不是指针(尽管在这种情况下,它可能&num等同于num指针)。

于 2013-05-31T22:28:17.373 回答