gpt4 book ai didi

c - 我需要将指针从结构单独写入文件吗?

转载 作者:行者123 更新时间:2023-12-02 01:59:46 26 4
gpt4 key购买 nike

我正在努力学习使用 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;
}

所以我在这里选择的方式是分配*链接所需的所有内存。之后,我创建了一个链接结构的原型(prototype),其中初始化了所有数据。 (结构中的指针也指向初始化值)

之后,我将堆栈内存中原型(prototype)的所有数据复制到堆上的原始内存块。用 memcpy。

当我写一个文件链接时,Valgrind 对我大喊我想写未初始化的字节。

是因为我需要为结构中的所有指针单独分配内存吗?我不明白我是如何编写一个包含我想要的所有链接和数据的文件的。所以我可以读取它并重新应用到一个新的空链接结构。

我是 C 的新手,这是学习内存分配的早期尝试,所以我很高兴每一个批评我的代码的答案。我也在 stackoverflow 上搜索了答案,我找到了关于需要专门为结构中的指针分配内存的答案。但是我想不出如何在代码中实现它。我还阅读了关于制作一个循环,将代码写入结构中的文件以及我需要的链接。这是最有效和单一的方式吗?

顺便说一句:我需要使用指针,因为最后我希望这些指针能够为字符和地址结构数组提供不同的大小。

最佳答案

“外部化”一个内存对象/数据结构,例如当通过网络将对象发送到另一个进程或写入文件时,需要将内存对象格式化或转换为可移植的表示形式。指针仅在进程的上下文中才有意义。

通常在发送或写入时将内存对象编码为可移植缓冲区,在接收或读取时将可移植缓冲区解码为内存对象。

几乎所有的 unix/linux/bsd 系统都有外部数据表示、XDR、库例程作为 libc 的一部分。执行“man xdr”以获取更多信息。

如果您使用 C 语言,xdr 非常适合。

关于c - 我需要将指针从结构单独写入文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17834771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com