c - 如何 free() 一个结构正确的 malloc()?

标签 c pointers free malloc

我有一个 malloc() 结构,在使用它们之后,我想释放它,但我的程序在这里卡住了。谁能告诉我,我做错了什么?

这是我的代码:

struct data  
{  
char *filename;  
char *size;  
};   
 //primarypcs is a long type variable
struct data *primary = (struct data *)malloc( primarypcs * sizeof( struct data ) );  
memset( primary, 0, sizeof(struct data *) * primarypcs );  
...
...
...
for ( i = 0; i < primarypcs; i++ )  
{
   free( primary[i].filename );  //<----my program freezes here
   free( primary[i].size );      //<----or here
}
free( primary );  

提前致谢!

坎比

编辑:

我如何为文件名和大小正确分配内存?

编辑2:

抱歉,我很匆忙,没有告诉您您需要的所有信息。让我现在做 :) 基本上,我想创建一个应用程序,它获取两个给定驱动器/文件夹的文件列表,然后比较它们。我认为(现在仍然如此),最简单的方法是,当我将文件名及其大小存储在如上所述的结构中时。所以我必须为文件名和大小动态分配内存(我认为这就是他们所说的),当然也为结构分配内存。

最佳答案

您没有展示完整的代码,很多地方都可能出错,但一个错误已经很明显了。线路

memset( primary, 0, sizeof(struct data *) * primarypcs );   

并没有按照您认为的那样去做。由于 sizeof 中的类型错误,它没有将整个数组清零。本来应该是

memset( primary, 0, sizeof(struct data) * primarypcs );   

请注意 sizeof 下没有 *。由于这个错误,数组中的大多数指针都包含垃圾作为它们的初始值。如果您没有在省略的代码中将它们设置为有意义的内容,您对 free 的调用将收到垃圾参数并失败。

一般来说,为了减少出现此类错误的可能性,最好避免在程序中提及类型名称,但在声明中除外。由于您的问题被标记为 C++(即使它确实看起来像 C),因此不可能摆脱 malloc 上的类型转换,但除此之外我会说以下内容看起来更好

struct data *primary = (struct data *) malloc( primarypcs * sizeof *primary );   
memset( primary, 0, primarypcs * sizeof *primary );   

而且,作为旁注,如果您的代码旨在成为 C++,您可以通过更优雅、紧凑和可移植的方式获得相同的结果

data *primary = new data[primarypcs]();

当然,在这种情况下,您必须使用适当的 C++ 功能而不是 free 来释放内存。

关于c - 如何 free() 一个结构正确的 malloc()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2181526/

相关文章:

c++ - 当一个类的所有实例都被销毁时释放内存

c - 结构体/构造函数/指针 - C 编程语言

javascript - 如何释放和垃圾收集 WebGL 上下文?

C++ 字符串重新分配,旧字符串是否正确释放?

c - 多维数组是通过临时指针访问的吗?

ios - 在 Xcode iOS 项目中使用 C 头文件和实现文件

c++ - 在这里使用指针 vector 是不必要的还是更糟,导致内存泄漏?

c - 如何在 glibc 中检测到双重释放?

C 从链表中删除节点

c - 可以给彼此分配不同类型的指针吗?