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

标签 c arrays memory-management struct memory-leaks

编辑 [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/

相关文章:

C结构初始化和指针

c++ - 如何在C++中更清楚地包含头文件

arrays - Powershell 获取服务器列表,并添加 "server"属性

c - 错误: variable (struct) has initializer but incomplete type (C)

c - 分配页面对齐的内存块有什么好处?

c - 处理信号时分配内存的最佳方法是什么?

c - 如何使用翻译器 f2c 编译单个 Fortran 对象?

javascript - 中心为 0, 0 的矩阵网格

php获取唯一的子数组

c++ - 使用 numa_alloc_onnode() 分配小块有限制吗?