为什么在函数里面申请的动态内存,在函数外就无效?

#include<stdio.h>//为什么在函数里面申请的动态内存,在函数外就无效?
#include<stdlib.h>
void apply(int*b)
{
b=(int*)malloc(sizeof(int));
*b=6;
printf("b:%d %d\n",b,*b);
}
int main(void)
{int*a=NULL;
printf("a:%d\n",a);
apply(a);
printf("a:%d\n",a);}

在函数里面申请的动态内存在函数有效的,但是指向这块内存的指针需要是全局的,否则局部指针被释放就找不到这块动态申请的内存,这样也就用不了,相当于无效了。
C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
使用动态内存分配的程序中,常常会出现很多错误。
1. 对NULL指针进行解引用操作
2. 对分配的内存进行操作时越过边界
3. 释放并非动态分配的内存
4. 试图释放一块动态分配的内存的一部分以及一块内存被释放之后被继续使用。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-12-16
在函数体内动态分配了内存,b是关联这片内存区域的句柄,虽然动态分配了内存不释放的话是一直存在的,但是b指针的生命周期就只在这个函数体中有效,出了函数体,b这个指针就被删除了,虽然分配的内存还在,但是关联这个空间的句柄没有了,这个空间就属于内存泄露了,因为索引不到它了。
所以要在函数的返回中用另外一个指针保存这个地址!
大致应该是这样吧:
int* apply(int*b)
{
....
return b;
}
int *b=apply(a);

printf("a:%d\n",b);本回答被提问者和网友采纳
第2个回答  2014-02-23

因为 b 是指针类型,在 apply 里修改 b 的值在返回后是无效的。

正确的是传入指针的指针,如

void apply( int **b )
{
    *b = (int*)malloc(sizeof(int));
}

第3个回答  2014-02-23
举个例子,在网上买东西,你告诉卖家一个地址放到a里让他往这个地址发货(主函数调用apply(a);),但是卖家拿到的不是a,而是b,但内容是一样的,然后卖家说只能往另一个地址发货(malloc)你自己去取吧,我就把地址存在b里。a在你手里,b在卖家手里,你不知道b的内容,所以货就找不着了。
第4个回答  2014-02-23
函数调用结束,系统自动回收了
相似回答