【问题标题】:C copy static array into a structureC将静态数组复制到结构中
【发布时间】:2015-12-06 20:32:39
【问题描述】:

我的结构如下所示:

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

我遇到了分段错误(第一次打印有效)。我还做错了什么?

【问题讨论】:

  • 如果您知道要复制的元素的大小,请尝试使用 memcpy 进行复制
  • 这些有不同的类型!指针不是数组!
  • 1) 不要在 C 中转换 malloc 和朋友的结果。2) 你有一个指向指针的指针,而不是你的 struct 中的二维数组。这与二维数组不同! 3) 你调用了未定义的行为。
  • 我知道它和二维数组不一样。我想知道如何让它指向那个二维数组(或另一个具有相同值的数组)
  • 在编辑版本中,memcpy 是无望的。您刚刚分配了几个小内存块,都在不同的位置。您如何期望使用单个 memcpy 一次将它们全部写入。在 C 语言中,清楚地了解内存分配的位置非常重要。

标签: c pointers deep-copy


【解决方案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);
}

如果您想动态创建二维数组,无论如何都必须使用 1 for 循环。如果您也不想这样做,则必须声明一个静态数组!

【讨论】:

    【解决方案2】:

    最好在同一个地方分配和复制:

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

    【讨论】:

      猜你喜欢
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多