2015-12-06 112 views
1

我有看起來像這樣的結構:複製C靜態數組到結構

typedef struct object { 
    entry **entries; 
} object; 

typedef struct entry { 
    int value; 
} entry; 

某處在我的代碼我有條目的靜態數組(具有一些隨機數據初始化);

entry entries[][] = {... (doesn't matter)...}; 

如何將這些條目複製到對象中? 我需要的是這樣的:

object obj; 
obj.entries = entries; 

編輯:我不希望每個元素在「for」循環複製。

經過建議:

好的。我有:

entry entries[initial_height][initial_width]; 
....initialize entries... 
object obj; 
int i; 
obj.entries = (entry**) malloc(initial_height * sizeof(entry*)); 

for (i = 0 ; i < initial_height; i++) { 
    obj.entries[i] = (entry*) malloc(initial_width * sizeof(entry)); 
} 

memcpy(obj.entries, entries, sizeof(entry) * initial_height * initial_width); 

printf("%d\n", entries[0][0].value); 
printf("%d\n", obj.entries[0][0].value); 

而且我得到一個分段錯誤(第一個打印作品)。我還在做什麼錯了?

+0

如果您知道要複製的元素的大小,請嘗試使用memcpy進行復制 – Pradheep

+0

它們有不同的類型!指針不是數組! – Olaf

+0

1)不要將'malloc'和朋友的結果放在C中。2)你有一個指向指針的指針,而不是'struct'中的二維數組。這與2D陣列不一樣! 3)你調用未定義的行爲。 – Olaf

回答

1

你的問題在於memcpymemcpy的基本思想是它從memcpy的參數中指定的2個指針開始,並複製你指定的字節數。

你的情況,你按照2個步驟::

1)您申報entry指針數組。

2)您聲明entry的數組,並將malloc返回的指針保存到(1)中聲明的指針數組中。

您還應該考慮到您在步驟(2)中聲明的每個數組都可以在內存中的任何位置聲明,而不一定是連續的。

所以,當你調用memcpy(obj.entries[i], entries[i], sizeof(entry) * initial_width);你開始複製的entries字節的指針obj.entries[i]數組裏面只有大小initial_height * sizeof(entry*),讓你超出此限制複製任何東西,被破壞的記憶,這是你得到一個分割的原因故障。 (既然你也過寫存儲entry動態申報陣列位置的字節)

一種可能的方法來做到這將是如下::

for(int i = 0; i < initial_height; i++) { 
    memcpy(obj.enteries[i], entries[i], sizeof(entry) * initial_width); 
} 

你無論如何都將不得不使用1 for如果您想要動態創建2D陣列,請循環。如果你不想要這個,你將不得不聲明一個靜態數組!

0

這將是更好地在同一個地方分配和複製:

for (i = 0 ; i < initial_height; i++) { 
    obj.entries[i] = (entry*) malloc(initial_width * sizeof(entry)); 
    memcpy(obj.entries[i], entries[i], sizeof(entry) * initial_width); 
}