malloc和scope

malloc和scope,c,malloc,scope,C,Malloc,Scope,我正努力用c语言来理解malloc——特别是当它需要自由的时候()。我在gcc中遇到了一些奇怪的错误,例如: 。。。free():无效的下一个大小(快速):… 当我试图释放一个字符指针时。例如,当读取输入文件时,执行以下操作时,它将在某些行上崩溃: FILE *f = fopen(file,"r"); char x[256]; while(1) { if(fgets(x,sizeof x,f)==NULL) break; char *tmp = some_function_ret

我正努力用c语言来理解malloc——特别是当它需要自由的时候()。我在gcc中遇到了一些奇怪的错误,例如:

。。。free():无效的下一个大小(快速):…

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

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
}
我检查了一些明显的东西,比如x为NULL,但它不是;它只是在随机线路上崩溃

但我真正的问题是-我什么时候需要使用free()?或者,更准确地说,我什么时候不应该使用免费的?如果malloc在一个函数中,我返回使用malloc()的变量,该怎么办?在for或while循环中呢?结构数组的malloc-ing与字符串/字符指针的规则相同吗

我从gcc中关于程序崩溃的错误中得出结论,我只是不理解malloc和free。我在谷歌度过了我的美好时光,但我仍在碰壁。你找到什么好的资源了吗?我所看到的一切都表明,每当我使用malloc时,我都需要免费使用。但是我尝试了一下,我的程序崩溃了。所以,可能它是不同的,基于一个变量的范围?当一个变量在循环的末尾被声明时,C是否会在循环的末尾释放内存?在函数的末尾

因此:


for(i=0;i通常,对
malloc
的每次调用必须有一个
free
的相应调用*这与范围无关(即与函数或循环无关)



*此规则的例外情况包括使用诸如
strdup
之类的函数,但原理是相同的。

一般来说,对
malloc
的每个调用都必须有一个
free
的相应调用。这与作用域无关(即与函数或循环无关)



*此规则的例外情况包括使用诸如
strdup
之类的函数,但原理是相同的。

好的,malloc的内存范围在调用
malloc
free
之间,或者在进程停止之前(即操作系统清理进程时)。如果您从未调用
free
,则会发生内存泄漏。当您可以传递到
free
的地址在您实际使用之前超出范围时,可能会发生这种情况-这就像松开了车钥匙一样,车仍然在那里,但您无法真正驾驶它。您遇到的错误很可能是因为函数返回了p指向未使用
malloc
分配的某个内存,或者返回一个空指针,传递给
free
,这是您无法执行的。

嗯,malloc的内存范围介于调用
malloc
free
之间,或者直到进程停止(即操作系统清理进程时)。如果您从未调用
free
,则会发生内存泄漏。当您可以传递到
free
的地址在您实际使用之前超出范围时,可能会发生这种情况-这就像松开了车钥匙一样,车仍然在那里,但您无法真正驾驶它。您遇到的错误很可能是因为函数返回了p指向未使用
malloc
分配的某个内存,或者返回一个空指针,传递给
free
,但您不能这样做。

广义上说,
malloc()
返回的每个指针最终都必须传递给
free()
。存储指针的变量的作用域不会影响这一点,因为即使变量不再在作用域中,指针指向的内存仍将被分配,直到您在其上调用
free()

广义上说,
malloc()返回的每个指针
最终必须传递给
free()
。存储指针的变量的作用域不会影响这一点,因为即使变量不再在作用域中,指针指向的内存仍将被分配,直到调用
free()

当你不再访问它时,你应该释放内存。如果你要访问它,你不应该释放内存。这会给你带来很多痛苦。

当你不再访问它时,你应该释放内存。如果你要访问它,你不应该释放内存。这会给你带来很多痛苦。

malloc()是C的动态分配器。您必须了解自动(作用域)变量和动态(手动)变量之间的区别

自动变量在其作用域的持续时间内有效。它们是您声明的,没有任何修饰:
intx;

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

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

这方面的主要用法示例是典型的链表。如果要使用通用的“插入/删除/查找”,则列表节点不可能是任何作用域的本地节点列表操作功能。因此,必须动态分配每个节点,列表操作功能必须确保释放不再属于列表的节点

总之,变量分配从根本上来说主要是一个范围问题。如果可能的话,让一切都自动进行,你不必做任何事情。如果必要,使用动态分配,并注意在适当的时候手动取消分配

(编辑:正如@Oli所说,您有时也可能希望在严格的本地上下文中使用动态分配,因为大多数平台将自动变量的大小限制在比动态内存小得多的范围内
for(i=0;i<100;i++) char *x=malloc(n); // no need to use free(x)?
char *x;
for(i=0;i<100;i++) {
    x=malloc(n);
    free(x); //must do this, since scope of x greater than loop?
}
int* allocate_an_integer_array(int n)
{
    int* p = (int*) (malloc(sizeof(int)*n));
    return p;
}