c - 为结构中的变量分配内存的最佳方法是什么?

标签 c arrays memory data-structures

比如我有这样的结构和代码:

typedef struct
{
long long *number;
} test;

test * test_structure;
test_structure = malloc(sizeof(test));
test_structure->number = malloc(sizeof(long long) * 100);
free(test_structure->number);
free(test_structure);

对比这个结构和代码:

typedef struct
{
long long number[100];
} test;

test * test_structure;
test_structure = malloc(sizeof(test));
free(test_structure);

因为我知道数字数组将始终为 100,所以这些方法中的任何一种是完全可以接受的,还是一种方法比另一种方法更好,为什么?

最佳答案

第二种方式更好,原因如下:

  1. 您只需释放一个分配,而不是两个(减少内存泄漏的可能性)。
  2. 您已将数组的大小编码到数据结构中,这有助于代码分析。第一个版本可以有任何大小,没有人可以说任何下标都是错误的。如果您添加一个已适当初始化为第一个结构的“大小”成员,则此论点的影响力会较小,但影响力不会小很多。
  3. 您可以通过结构赋值复制整个第二个结构;你不能以同样的方式复制第一个结构。
  4. 生成的汇编器与第一个略有不同(更长)(它必须从成员中获取地址,然后取消引用它,而不是仅仅对第二个取消引用)。

尽管如此,这两种方法在本质上是相同的。您使用(我很想说“浪费”,但这不太公平)更多的空间与第一个,但这不太可能是一个主要问题(如果是,您可能希望改变大小100,因为与修改指针与数组相比,这将为您节省更多空间。

关于c - 为结构中的变量分配内存的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6769481/

相关文章:

iOS:带有日期的数组中的 UICollectionView 部分

python - python中的静态内存: do loops create new instances of variables in memory?

使用 Capifony 部署 Symfony2 项目时出现 PHP fatal error

Python ctypes 和指针作为函数参数

c - c中的参数类型和数量检查

java - 为什么 java 从具有大尺寸数字的第一个维度开始初始化二维数组需要很长时间?

ios - 如何交换swift数组中的元素?

c - 存在表中的键索引搜索

具有多线程的 C 矩阵

java - 由于 LogManager.getLogger(Logger.class.getName()); 导致 PermGen 空间增加;