malloc和范围

ceg*_*ult 1 c malloc scope

我正在努力将我的脑袋包裹在c中的malloc - 特别是当它需要自由()时.我在gcc中遇到奇怪的错误,例如:

... free(): invalid next size (fast): ...

当我尝试释放一个char指针.例如,从输入文件读取时,在执行以下操作时,它将在某些行上崩溃:

FILE *f = fopen(file,"r");
char x[256];
while(1) {
    if(fgets(x,sizeof x,f)==NULL) break;
    char *tmp = some_function_return_char_pointer(x); //OR malloc(nbytes);
    // do some stuff
    free(tmp); // this is where I get the error, but only sometimes
}
Run Code Online (Sandbox Code Playgroud)

我检查了明显的事情,比如x是NULL,但事实并非如此; 它只会在随机线路上崩溃.

但我真实的问题是 - 我什么时候需要使用free()?或者,可能更准确,我何时不应该免费使用?如果malloc在函数中,我返回使用malloc()的var怎么办?在for或while循环中怎么样?对于一个struct数组,mallocing是否与string/char指针具有相同的规则?

我收集了程序崩溃时我遇到的错误,我只是不理解malloc和free.我和Google一起度过了愉快的时光,而且我还在打砖墙.你找到了什么好的资源吗?我看到的一切都说每当我使用malloc时我都需要免费使用.但后来我尝试了,我的程序崩溃了.那么根据变量的范围可能有所不同?当在其中声明变量时,C是否在循环结束时释放内存?在功能结束时?

所以:

for(i=0;i<100;i++) char *x=malloc(n); // no need to use free(x)?
Run Code Online (Sandbox Code Playgroud)

但:

char *x;
for(i=0;i<100;i++) {
    x=malloc(n);
    free(x); //must do this, since scope of x greater than loop?
}
Run Code Online (Sandbox Code Playgroud)

是对的吗?

希望我有意义......

Ker*_* SB 5

malloc()是C的动态分配器.您必须了解自动(范围)和动态(手动)变量之间的区别.

自动变量在其范围内持续存在.他们是你宣布没有任何装饰的人:int x;

C程序中的大多数变量应该是自动的,因为它们是某些代码(例如函数或循环)的本地变量,并且它们通过函数调用和返回值进行通信.

您需要动态分配的唯一时间是您有一些需要比任何给定范围更长的数据.这些数据必须动态分配,并在不再需要时最终释放.

这方面的主要用法示例是您的典型链接列表.如果要使用通用的"插入/擦除/查找"列表操作函数,则列表节点不可能是任何范围的本地节点.因此,必须动态分配每个节点,并且列表操作函数必须确保它们释放那些不再属于列表的节点.

总之,变量分配从根本上来说主要是范围问题.如果可能,保持一切自动,你不必做任何事情.如有必要,请使用动态分配,并在适当时手动取消分配.

(编辑:正如@Oli所说,您可能还希望在严格的本地环境中使用动态分配,因为大多数平台将自动变量的大小限制为比动态内存大小小得多的限制.想想"巨大的阵列"超过自动变量的可用空间通常有一个多彩的名称,如"堆积超限"或类似的东西.)