C将静态数组复制到一个结构中

时间:2015-12-06 20:32:39

标签: c pointers deep-copy

我有一个看起来像这样的结构:

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);

我遇到了分段错误(第一次印刷工作)。我还在做什么错?

2 个答案:

答案 0 :(得分:1)

你的问题在于memcpymemcpy中的基本思想是它从memcpy参数中指定的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);
}

如果要动态创建2D数组,则无论如何都必须使用1 for循环。如果您不想要这个,您将必须声明一个静态数组!

答案 1 :(得分: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);
}