2013-05-31 42 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]',那就沒問題了(當然,如果你提到的話,它沒有通過一個函數並且被腐蝕成一個指針)。 –