加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C何时分配和释放内存 – 在函数调用之前,在函数调用之后……等等

发布时间:2020-12-16 10:27:38 所属栏目:百科 来源:网络整理
导读:我正在使用我的第一个直接C项目,自从我在C上工作以来已经有一段时间了.所以整个内存管理有点模糊. 我有一个我创建的功能,将验证一些输入.在下面的简单示例中,它只是忽略空格: int validate_input(const char *input_line,char** out_value){ int ret_val =
我正在使用我的第一个直接C项目,自从我在C上工作以来已经有一段时间了.所以整个内存管理有点模糊.

我有一个我创建的功能,将验证一些输入.在下面的简单示例中,它只是忽略空格:

int validate_input(const char *input_line,char** out_value){

    int ret_val = 0; /*false*/
    int length = strlen(input_line);
    out_value =(char*) malloc(sizeof(char) * length + 1);

    if (0 != length){

        int number_found = 0;
        for (int x = 0; x < length; x++){

            if (input_line[x] != ' '){ /*ignore space*/

                /*get the character*/
                out_value[number_found] = input_line[x];
                number_found++; /*increment counter*/
            }
        }
        out_value[number_found + 1] = '';

        ret_val = 1;
    }

    return ret_val;

}

我应该在调用函数之前执行此操作而不是在函数内部为out_value分配内存,并始终期望调用者在传入函数之前分配内存?根据经验,在函数返回之前是否应始终释放在函数内部分配的任何内存?

解决方法

我遵循两条非常简单的规则,让我的生活更轻松.

1 /只要您知道需要,就可以在需要时分配内存.这将允许您在做太多工作之前捕获内存不足错误.

2 /每个已分配的内存块都有一个责任属性.当责任通过函数接口时应该很清楚,此时释放该内存的责任随内存一起传递.这将保证某人有明确规定的释放内存的要求.

在您的特定情况下,如果您希望将值返回给调用者,则需要传入双字符指针:

int validate_input (const char *input_line,char **out_value_ptr) {
    : :
    *out_value_ptr =(char*) malloc(length + 1); // sizeof(char) is always 1
    : :
    (*out_value_ptr)[number_found] = input_line[x];
    : :

只要您清楚地说明函数的期望,您就可以在调用者或函数本身中分配内存.因为你知道所需的尺寸,所以我更喜欢这个功能.

但请记住,您可以允许两种选择.换句话说,如果函数传递了指向NULL的char **,请让它分配内存.否则它可以假设调用者已经这样做了:

if (*out_value_ptr == NULL)
        *out_value_ptr =(char*) malloc(length + 1);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读