如何释放()一个正确的malloc()结构?

kam*_*mpi 7 c malloc free pointers

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

这是我的代码:

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 );  
Run Code Online (Sandbox Code Playgroud)

提前致谢!

kampi

编辑:

我如何正确malloc内存的文件名和大小?

EDIT2:

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

AnT*_*AnT 7

你没有展示整个代码,很多东西都可能出错,但是一个错误已经很明显了.这条线

memset( primary, 0, sizeof(struct data *) * primarypcs );   
Run Code Online (Sandbox Code Playgroud)

没有做你认为它正在做的事情.由于类型错误导致整个阵列没有归零sizeof.它很可能应该是

memset( primary, 0, sizeof(struct data) * primarypcs );   
Run Code Online (Sandbox Code Playgroud)

注意没有*sizeof.由于此错误,数组中的大多数指针都包含垃圾作为其初始值.如果你没有在省略的代码中将它们设置为有意义的东西,那么你的调用free将接收垃圾参数并失败.

通常,为了减少此类错误的可能性,最好避免在程序中提及类型名称,声明除外.既然你的问题被标记为C++(即使它肯定看起来像C),也不可能摆脱类型转换malloc,但除此之外我会说以下看起来更好

struct data *primary = (struct data *) malloc( primarypcs * sizeof *primary );   
memset( primary, 0, primarypcs * sizeof *primary );   
Run Code Online (Sandbox Code Playgroud)

而且,作为旁注,如果您的代码是C++,那么您可以以更加优雅,紧凑和便携的方式获得相同的结果

data *primary = new data[primarypcs]();
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,您必须使用适当的C++功能而不是取消分配内存free.