c – 返回变量的正确方式来释放内存

我创建了一个旨在获取用户输入的功能.它要求将内存分配给保存用户输入的变量;但是,在函数结束时返回该变量.释放分配的内存的正确方法是什么?返回变量的值?

这是代码

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;
  }

你不应该做的就是这样

free(input + n);

因为输入n不是由malloc()返回的指针.

但是你的代码,有其他问题你应该照顾

>你为MAX_SIZE字符分配空间,所以你应该乘以sizeof(char),它是1,而不是分配MAX_SIZE指针的sizeof(char *),也可以使MAX_SIZE作为一个函数参数,因为如果你正在分配一个固定的缓冲区,你可以在main()中定义一个大小为MAX_SIZE的数组,如char input [MAX_SIZE],并将其作为参数传递给readInput(),从而避免使用malloc()和free().>你正在分配那么多的空间,但是你不能阻止你的while循环中的溢出,你应该验证i< MAX_SIZE.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...