C 释放返回变量内存的正确方法

C 释放返回变量内存的正确方法,c,memory,malloc,free,C,Memory,Malloc,Free,我创建了一个用于获取用户输入的函数。它要求将内存分配给保存用户输入的变量;但是,该变量在函数末尾返回。释放已分配内存/返回变量值的正确方法是什么 代码如下: char *input = malloc(MAX_SIZE*sizeof(char*)); int i = 0; char c; while((c = getchar()) != '\n' && c != EOF) { input[i++] = c; } return input; 我应该返回输入地址并在使用后

我创建了一个用于获取用户输入的函数。它要求将内存分配给保存用户输入的变量;但是,该变量在函数末尾返回。释放已分配内存/返回变量值的正确方法是什么

代码如下:

char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;

while((c = getchar()) != '\n' && c != EOF) {
    input[i++] = c;
}

return input;
我应该返回输入地址并在使用后释放它吗


想知道释放输入变量的最合适的方法。

这很简单,只要将
free()
返回的指针传递给
malloc()
就可以了

比如说

char *readInput(size_t size)
 {
    char *input;
    int   chr;
    input = malloc(size + 1);
    if (input == NULL)
        return NULL;
    while ((i < size) && ((chr = getchar()) != '\n') && (chr != EOF))
        input[i++] = chr;
    input[size] = '\0'; /* nul terminate the array, so it can be a string */
    return input;
 }

 int main(void)
  {
     char *input;
     input = readInput(100);
     if (input == NULL)
         return -1;
     printf("input: %s\n", input);
     /* now you can free it */
     free(input);
     return 0;
  }
因为
input+n
不是
malloc()
返回的指针

但是,您的代码还有其他问题需要注意

  • 您正在为
    MAX\u SIZE
    char
    s分配空间,因此您应该乘以
    sizeof(char)
    ,即
    1
    ,而不是
    sizeof(char*)
    ,后者将分配
    MAX\u SIZE
    指针,您还可以将
    MAX\u SIZE
    作为函数参数,因为如果要分配固定缓冲区,可以在
    main()
    中定义一个数组,其大小为
    MAX\u size
    类似
    char input[MAX\u size]
    ,并将其作为参数传递给
    readInput()
    ,从而避免
    malloc()
    free()

  • 您正在分配这么多的空间,但无法防止
    循环中的溢出当
    循环时,您应该验证
    i


  • 您可以编写返回类型为
    char*
    的函数,返回
    input
    ,并要求用户在处理完数据后调用
    free


    您还可以要求用户自己传入一个大小合适的缓冲区,以及缓冲区大小限制,并返回写入缓冲区的字符数。

    这是一个典型的c案例。函数为其结果占用内存,调用方必须释放返回值。您现在正走在c内存泄漏的薄冰上。2原因

    第一,;您无法以可执行的方式传达自由需求(即编译器或运行时无法帮助您-与指定参数类型不同)。你只需要把它记录在某个地方,并希望打电话的人已经阅读了你的文档

    第二:即使调用者知道要释放结果,他可能会犯错误,也会采取一些不会释放内存的错误路径。这不会立即导致错误,事情似乎正常,但运行3周后,你的应用程序在内存不足时崩溃


    这就是为什么有这么多“现代”语言集中在这个话题上,C++智能指针,java,C等垃圾收集,……/p>如果你<代码> MalOC/<代码>,最终有人需要“<代码>免费>代码>,如果你在另一个API或调用方中。相关的,如果在您的目标平台上得到支持,POSIX.1-2008中添加的库函数似乎几乎可以实现您想要实现的功能。它仍然要求调用者最终
    释放
    任何返回的分配,但也提供了重用语义,而您的代码没有这样做。根据预期用途和目标平台,这可能值得考虑。他不能使用本地数组,因为当它返回并且函数的堆栈帧被破坏时,将无法保证数组完好无损。编译器将给您一个警告:“函数返回局部变量[-Wreturn local addr]的地址”。除此之外,回答得很好。@EnzoFerber我的意思是将数组传递给函数并在那里填充,我知道不能返回本地数组。我想我需要澄清这一点。
    
    free(input + n);