gpt4 book ai didi

C 内存分配 : Fixed-length array in a struct in a struct

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:20 25 4
gpt4 key购买 nike

编辑 [2016-08-26-001]:我已更正评论中指出的错误。正如我在下面提到的,我快速抓取并修改了一些代码只是为了说明问题,抱歉 :(

以下是我原始来源的修改摘录(仍然是一团糟!!!)但它应该这样做:

#define STORAGE_LIMIT_NAME  64
#define DB_INIT_ENTRIES 100

struct entry {
char fname[STORAGE_LIMIT_NAME];
char sname[STORAGE_LIMIT_NAME];
};

struct database {
struct entry *data;
unsigned int entries;
unsigned int entrysz;
};

struct database mydb;

mydb.entrysz = sizeof(struct entry);
mydb.entries = DB_INIT_ENTRIES;
mydb.data = malloc(mydb.entrysz * DB_INIT_ENTRIES);

free(mydb.data);

我需要知道以下内容:

1) 我做的对吗?也就是说,内存 all 是否被分配到堆并因此被释放?我不想内存泄漏。

2) 是否有更优雅的解决方案,既不会使事情过于复杂,又能轻松限制名称长度?此外,它最好是快速的。

抱歉,如果之前有人问过这个问题,我已经查看了整个网站和谷歌,但我所发现的只是其他人偶尔会做一些模糊相似的事情,同时提出完全不同的问题。到目前为止,我在网上看过的任何学习指南中都没有包括这一点。如果我想成为一名更好的程序员,我需要理解这一点,而且我是自学成才的,所以我没有可以请教的讲师。顺便说一句,欢迎任何指向优秀的免费 C(不是 C++)学习 Material 的链接。非常感谢。

最佳答案

1) 是的,您此处的代码为 DB_INIT_ENTRIES 的数组分配了足够的空间结构,每个都是 sizeof(struct entry)字节大小:

mydb.entrysz = sizeof(struct entry);
mydb.entries = DB_INIT_ENTRIES;
mydb.data = malloc(mydb.entrysz * DB_INIT_ENTRIES);

此调用然后释放整个数组:

free(mydb.data);

您没有展示的是如何访问已分配数组中的每个结构:

struct entry *  entp;     // Entry pointer
entp = &mydb.data[i]; // Where 0 <= i < mydb.entries


切线

作为编程风格的问题(与您的问题无关),我更愿意通过添加显式 +1 来明确表示字符数组旨在保存以 null 结尾的字符串。到数组大小,即:

#define STORAGE_LIMIT_NAME  63

struct entry {
char fname[STORAGE_LIMIT_NAME+1];
char sname[STORAGE_LIMIT_NAME+1];
};

显式 +1清楚地表明名称数组以额外的 NUL 字符结尾。它还使STORAGE_LIMIT_NAME根据字符定义最大名称长度,而不是其分配大小。


[*] 顺便说一句,entry曾经是早期 C 的保留关键字,但在 1988 年语言标准化时被删除。

关于C 内存分配 : Fixed-length array in a struct in a struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166739/

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