我正在尝试使用 C 进行编程。在我看来,一个巨大且重要的步骤是了解如何使用原始内存块,初始化它们并释放它们。在手头的测试程序中,我创建了两个结构,每个结构都有一个指针。
struct Address {
int id;
int var;
char *name;
};
struct Link {
int link_var;
struct Address *addr;
};
在这种情况下,name 和 addr 是指针,因为我希望它们是动态大小的。
int main(int argc, char *argv[])
{
FILE *file = fopen("test.dat", "w");
int i = 0;
struct Link *link = malloc(sizeof(struct Link) + (sizeof(struct Address)*10) + (10*10));
struct Address addr_container[10];
for(i = 0; i < 10; i++) {
char temp_name[10];
memset(temp_name, '\0', 10);
temp_name[0] = 'A';
struct Address addr_proto = {.id = i, .var = 10, .name = temp_name};
addr_container[i] = addr_proto;
}
struct Link link_proto = {.link_var = 2, .addr = addr_container};
memcpy(link, &link_proto, sizeof(struct Link) + (sizeof(struct Address)*10) + (10*10));
printf("%s\n", link->addr[4].name);
int rc = fwrite(link, sizeof(struct Link) + (sizeof(struct Address)*10) + (10*10), 1, file);
if(rc != 1) printf("Failed to write database.");
fclose(file);
free(link);
return 0;
}
所以我在这里选择的方式是分配 *link 所需的所有内存。之后,我创建了一个链接结构的原型,其中所有数据都已初始化。(结构中的指针也指向初始化值)
之后,我将堆栈内存中原型中的所有数据复制到堆上的原始内存块中。与 memcpy。
当我写一个文件的链接时,Valgrind 对我大喊我要写未初始化的字节。
是因为我需要为结构中的所有指针单独分配内存吗?我不明白我如何编写一个包含我想要的所有链接和数据的文件。所以我可以阅读它并重新应用到一个新的空链接结构。
我是 C 的新手,这是学习内存分配的早期尝试,所以我很高兴每个批评我的代码的答案。我也确实在 stackoverflow 上搜索了答案,并找到了关于需要为结构中的指针分配内存的答案。但我无法弄清楚如何在代码中实现它。我还阅读了有关制作一个循环的信息,该循环将代码写入结构中的文件以及我需要的链接。这是最有效和最单一的方法吗?
顺便说一句:我需要使用指针,因为最后我希望这些指针可以使字符和地址结构数组的大小不同。