C将静态数组复制到结构中
C copy static array into a structure
我的结构如下所示:
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);
而且我遇到了分段错误(第一个印刷作品)。我还做错了什么?
最好在同一个地方分配和复制:
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);
}
你的问题出在memcpy
。 memcpy
中的基本思想是从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
循环。如果您也不想这样做,则必须声明一个静态数组!
我的结构如下所示:
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);
而且我遇到了分段错误(第一个印刷作品)。我还做错了什么?
最好在同一个地方分配和复制:
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);
}
你的问题出在memcpy
。 memcpy
中的基本思想是从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
循环。如果您也不想这样做,则必须声明一个静态数组!