将值从整数数组复制到整数结构

时间:2013-05-31 22:19:51

标签: c memory-management

我有一个整数数组:

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

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

2 个答案:

答案 0 :(得分:3)

这里要说几点。首先:

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

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

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

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

然后你会有一个struct tuple的实际实例,而不仅仅是一个指针,memcpy会复制到那个内存。但是这个仍然是错误的因为:

1)数组的大小远大于struct tuple

的大小

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

顺便提一下,这适用于memcpy到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.当您将数组传递给函数时,它将作为指针传递。

答案 1 :(得分: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()的通话相匹配。

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