我有一个 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/