我有一个整数数组:
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);
有人可以帮助我解决我可能出错的地方吗?
答案 0 :(得分:3)
这里要说几点。首先:
struct tuple *arr;
memcpy(&arr,&num,sizeof(num));
arr
是struct 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)不保证结构的所有字段在内存中相邻。在p1
和p2
等之间可以有填充,因此结构和数组将以不同的方式排列在内存中,而不是直接可复制。
顺便提一下,这适用于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()
的通话相匹配。
此外,正如评论所指出的,您需要传递arr
和num
而不是&arr
和&num
。您希望复制数据,而不是指针(尽管可能&num
等同于num
作为指针,在这种情况下)。