函数内部使用malloc()在执行后释放已分配的内存吗?

时间:2020-08-17 06:21:23

标签: c

在函数返回后尝试打印结构变量的值时,它会打印一些随机文本(我认为这是由于内存分配错误)

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char s1[20];
    char s2[20];
    int n1;
} TEST;

void allocate(TEST *T, int n){
    T = malloc(sizeof(TEST)*n);
    for(int i=0; i<n; i++){
        sprintf((T+i)->s1, "string 1 of %d", i);
        sprintf((T+i)->s2, "string 2 of %d", i);
        (T+i)->n1 = i;
    }
}

int main(){

    TEST *T;
    int n = 3;
    allocate(T, n);
    for(int i=0; i<n; i++){
        printf("%s\n%s\n%d\n\n", (T+i)->s1, (T+i)->s2, (T+i)->n1);
    }

}

5 个答案:

答案 0 :(得分:2)

不,C绝对不会自动为您调用free

程序中的问题是,T的调用方中的allocate未被更改。 C严格来说是一种“按值传递”的语言。

一种解决方案是在TEST**中将T的类型更改为allocate

void allocate(TEST **T, int n){

使用

allocate(&T, n);
main

。然后,您在free中呼叫main

答案 1 :(得分:1)

程序通过将未初始化的T传递给函数来导致未定义的行为。此外,您永远不会将新的指针值从函数返回到main

指向新内存的指针是函数的输出,而不是输入。因此,它应该是一个返回值,而不是参数。例如:

TEST* allocate(int n)
{
    TEST* T = malloc(sizeof(TEST)*n);
    // etc.
    return T;
}

然后在主目录中:

TEST* T = allocate(n);
// ... use T ...
free(T);

答案 2 :(得分:0)

不,不是。您需要自己free() malloc()记忆。

您的程序照样会泄漏内存...但是对于此特定程序,这没什么大不了的,因为该进程死后该内存已释放。

答案 3 :(得分:0)

正如已经给出的答案所说,您需要调用mat-cell来释放内存。

您要分配指向的内存区域,因此需要一个navigation.openDrawer();

free

答案 4 :(得分:0)

不。程序的问题是T由副本传递给分配,并且分配给已分配内存的地址已分配给该副本。要解决此问题,您可以使第一个分配参数** T,在main中传入T的地址,然后在指针中取消指向指向指针的指针并分配给它。