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

C将静态数组复制到结构中,c,pointers,deep-copy,C,Pointers,Deep Copy,我有这样一个结构: typedef struct object { entry **entries; } object; typedef struct entry { int value; } entry; object obj; obj.entries = entries; 在我的代码中,我有一个静态的条目数组(用一些随机数据初始化) 如何将这些条目复制到对象中? 我需要这样的东西: typedef struct object { entry **entries; } obj

我有这样一个结构:

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

typedef struct entry {
  int value;
} entry;
object obj;
obj.entries = entries;
在我的代码中,我有一个静态的条目数组(用一些随机数据初始化)

如何将这些条目复制到对象中? 我需要这样的东西:

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

typedef struct entry {
  int value;
} entry;
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);
条目[初始高度][初始宽度];
..初始化条目。。。
对象对象对象;
int i;
obj.entries=(条目**)malloc(初始高度*尺寸(条目*);
对于(i=0;i<初始高度;i++){
对象条目[i]=(条目*)malloc(初始宽度*大小(条目));
}
memcpy(对象条目、条目、尺寸(条目)*初始高度*初始宽度);
printf(“%d\n”,条目[0][0]。值);
printf(“%d\n”,对象条目[0][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);
}
for(i=0;i
您的问题在于
memcpy
memcpy
的基本思想是,它从
memcpy
的参数中指定的两个指针开始,复制您指定的字节数

在您的情况下,请遵循两个步骤:

1) 您可以声明
项的指针数组

2) 声明
entry
的数组,并将
malloc
返回的指针保存到(1)中声明的指针数组中

您还应该考虑到,在步骤(2)中声明的每个数组都可以在内存中的任何位置声明,而不一定是连续的

因此,当您调用
memcpy时(obj.entries[i],entries[i],sizeof(entry)*初始宽度)
您开始将
项的字节数
复制到指针数组
obj.entries[i]
中,该数组的大小仅为
初始高度*sizeof(entry*)
,因此,复制的任何超出此限制的内容都会损坏内存,这就是出现分段错误的原因。(因为您还重写了存储动态声明的
条目数组位置的字节

一种可能的方法如下:

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

如果要动态创建2D数组,则必须对循环使用1
。如果你也不想这样做,你必须声明一个静态数组

如果您知道要复制的元素的大小,请尝试使用memcpy进行复制。这些元素有不同的类型!指针不是数组!1) 不要强制转换C中的
malloc
&friends的结果。2)在
struct
中有指向指针的指针,而不是2D数组。这与二维阵列不同!3) 您调用未定义的行为。我知道它与2D数组不同。我想知道如何使它指向编辑版本中的2D数组(或具有相同值的另一个数组),
memcpy
是没有希望的。您只分配了几个小内存块,它们都位于不同的位置。您希望如何使用一个memcpy一次编写它们。在C语言中,对内存分配的位置有一个清晰的头脑印象是很重要的。