C语言 —— 内存分配及内存释放

    在使用内存的过程中,很多时候问题并不在于管理指针,而在于管理它们指向的内存。还是从问题着手来总结。

1. 有时候我们的一个函数本该返回一个字符串,但当它返回调用者的时候,放回的字符串却是乱码。
    这个涉及到了函数调用栈。
    任何时候,拖函数返回指针,必须却好它指向的内存已经正确分配了。返回的指针可以指向静态分配的、调用者传入的或者通过malloc获得的缓冲区,但不能使局部的数组。
    例如:
    
char * func(int n)
    {
        cahr retBuf[20];
        sprintf(retBuf, "%d", n);
        return reuBuf;
    }

    在函数返回的时候,他的局部变量都会被抛弃。因此这里返回的指针指向了一个已经不存在的数组。那么如何解决这个问题?
    方法一:static char retBuf[20];即:将缓冲区声明为static的。但这个方法不是很好,调用者不能多次调用这个函数并同时保存所有的返回值。
    方法二:让调用者传入保存结果的指针:
        
 	char * func(int n, char * retBuf)
       {
            sprintf(retBuf, "%d", n);
            return reuBuf;
        }

         调用:
         char str[20];
         func(123, str);
    方法三:使用malloc:
        
 	char *func(int n)
        {
            char *retBuf = malloc(20);
            if (retBuf != NULL)
                sprintf(retBuf, "%d", n);
            return retBuf;
        }

      调用:
    char *str = func(123);
    需要注意的是:在不使用的时候一定要释放返回的指针。

2. 怎么样从函数返回多个值?
    方法一:参数返回。可以传入多个指针指向不同的地址,让函数填入需要返回的值;
    方法二:让函数返回包含需要之的结构体;
    方法三:前两种方法结合:让函数接受结构指针,然后再填入需要返回的数据。
    方法四:采用全局变量。(不提倡,在不得已时候采用)

3. 如何释放通过malloc申请的内存?
    (1)原则:每个malloc()调用,都必须有一个对应的free()。
    (2)经验:当程序中反复分配和释放指针的时候,通常最好在释放之后立即将其置NULL,以明确它们的状态。
    
4. 当调用malloc()为一个函数的局部指针分配内存是,还需要free()显式地释放吗?
    是的!这里涉及到指针和指针指向的内存的问题。指针和它指向的内存是完全不同的!局部变量在函数返回时就会释放,但是若该局部变量为指针变量,表示的是指针被释放,而不是它指向的对象。用malloc()分配的内存在显式释放之前都会保留。

5. 动态分配数组后,还可以改变其大小吗?
     可以,使用realloc()。


















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值