关于在子函数中调用malloc的问题

时间:2022-09-05 18:48:19
为了测试在子函数中,malloc分配的内存是否会释放,我写了下面的程序:

#include <stdio.h>
#include <malloc.h>

int main()
{
void write();
long a=0x003807b8,*q;
write();
q=a;
printf("%d\n",*q);

}
void write()
{
int *p;
p=(int *)malloc(4*sizeof(int));
p[0]=1;
p[1]=5;
p[2]=2;
p[3]=8;

}


0x003807b8:这是我在子函数中,得到的分配区域块的首地址,因为要测试它是否还存在,所以直接写到主函数中了,经过测试发现,在子函数中malloc的空间并不会自动释放,但是各个局部变量的空间均被释放。
现在遇到了一个问题,当全速运行这个程序时,输出的是:-33686019
单步运行时,输出的是1,这个是理想当中的,单步和全速为何结果不一样?
malloc分配内存的性质是什么?
恳请大家不吝赐教!万分感谢~~~

12 个解决方案

#1


malloc出来的空间是在堆中,要你自己释放,除非程序退出,不然不会释放
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL

#2


不会,malloc分配的内存是在堆里分配的,出了子函数,还是不会释放的。

#3


当然了,这又带来了一些问题,那就是,传指针进入函数来得到这块新分配的内存时,指针要传地址进入函数,可以是C++里的引用,也可以是C或C++里都有的传地址(二级指针)。小心出现内存泄露的问题

#4


#5


你还不如直接返回p的值,然后输出*p你会看到数组的值还在。

#6


0x003807b8只是DEBUG时的地址,非DEBUG状态地址不定

#7



//mark,多看书

#8


malloc分配的内存是在堆里分配

 用calloc()函数分配内存,推荐初始化了所分配的内存,所有的位都是0。

其他的楼上的都说了

#9


是的,你这个程序与测试malloc分配的内存是否会释放有什么关系?改下程序

#10


malloc出来的空间是在堆中,要你自己释放,除非程序退出,不然不会释放
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL

#11


FREE();

#12


唉,我以前也是这样想,但今天刚好又遇到这个问题,大家帮解决一下
#include <stdio.h>

void test(  char *p_c_char  );

void main()
{
char *p_test = NULL ;
test( p_test );
printf( "%s\n",p_test );//Êä³öΪ¿Õ
}
void test(  char *p_c_char  )
{
if( NULL != p_c_char )
{
free( p_c_char );
p_c_char = NULL;
}
p_c_char = ( char* )malloc(  10 * sizeof( char ) );
strcpy( p_c_char,"123456" );
printf( "%s\n",p_c_char );//Êä³ö"123456"
}

#1


malloc出来的空间是在堆中,要你自己释放,除非程序退出,不然不会释放
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL

#2


不会,malloc分配的内存是在堆里分配的,出了子函数,还是不会释放的。

#3


当然了,这又带来了一些问题,那就是,传指针进入函数来得到这块新分配的内存时,指针要传地址进入函数,可以是C++里的引用,也可以是C或C++里都有的传地址(二级指针)。小心出现内存泄露的问题

#4


#5


你还不如直接返回p的值,然后输出*p你会看到数组的值还在。

#6


0x003807b8只是DEBUG时的地址,非DEBUG状态地址不定

#7



//mark,多看书

#8


malloc分配的内存是在堆里分配

 用calloc()函数分配内存,推荐初始化了所分配的内存,所有的位都是0。

其他的楼上的都说了

#9


是的,你这个程序与测试malloc分配的内存是否会释放有什么关系?改下程序

#10


malloc出来的空间是在堆中,要你自己释放,除非程序退出,不然不会释放
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL

#11


FREE();

#12


唉,我以前也是这样想,但今天刚好又遇到这个问题,大家帮解决一下
#include <stdio.h>

void test(  char *p_c_char  );

void main()
{
char *p_test = NULL ;
test( p_test );
printf( "%s\n",p_test );//Êä³öΪ¿Õ
}
void test(  char *p_c_char  )
{
if( NULL != p_c_char )
{
free( p_c_char );
p_c_char = NULL;
}
p_c_char = ( char* )malloc(  10 * sizeof( char ) );
strcpy( p_c_char,"123456" );
printf( "%s\n",p_c_char );//Êä³ö"123456"
}