2015-12-06 21 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); 
}