2013-05-31 34 views
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 

因此,当我尝试打印,它seg故障:

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

您不能将'memcpy'指向未初始化的指针。 – chris

+3

另外,'arr'是一个指针,那八个字节的大小并不奇怪。 –

+5

@chris“memcpy”的参数是指针的地址。不确定这是否比未初始化的指针更糟或更好。 –

回答

0

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

或者,您可以用malloc(sizeof(num))的电话初始化arr,但一定要将此类电话与free()的电话相匹配。

此外,正如评论所指出的,您需要通过arrnum而不是&arr&num。你想复制数据,而不是指针(尽管在这种情况下&num等于num作为指针)。

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)结构不保证有他们所有的内存相邻领域。在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.当你将一个数组传递给一个函数时,它将作为一个指针传递。

+0

它看起来像'arr'是他的'struct tuple *',这意味着它是一个指向'tuple's的指针,因此sizeof()商数技巧将不起作用。如果'arr'是'struct tuple [5]',那就没问题了(当然,如果你提到的话,它没有通过一个函数并且被腐蚀成一个指针)。 –