#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
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL
#2
不会,malloc分配的内存是在堆里分配的,出了子函数,还是不会释放的。
#3
当然了,这又带来了一些问题,那就是,传指针进入函数来得到这块新分配的内存时,指针要传地址进入函数,可以是C++里的引用,也可以是C或C++里都有的传地址(二级指针)。小心出现内存泄露的问题
#5
你还不如直接返回p的值,然后输出*p你会看到数组的值还在。
#6
0x003807b8只是DEBUG时的地址,非DEBUG状态地址不定
#7
//mark,多看书
#8
malloc分配的内存是在堆里分配
用calloc()函数分配内存,推荐初始化了所分配的内存,所有的位都是0。
其他的楼上的都说了
用calloc()函数分配内存,推荐初始化了所分配的内存,所有的位都是0。
其他的楼上的都说了
#9
是的,你这个程序与测试malloc分配的内存是否会释放有什么关系?改下程序
#10
malloc出来的空间是在堆中,要你自己释放,除非程序退出,不然不会释放
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL
函数里的局部变量非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"
}
#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
函数里的局部变量非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。
其他的楼上的都说了
用calloc()函数分配内存,推荐初始化了所分配的内存,所有的位都是0。
其他的楼上的都说了
#9
是的,你这个程序与测试malloc分配的内存是否会释放有什么关系?改下程序
#10
malloc出来的空间是在堆中,要你自己释放,除非程序退出,不然不会释放
函数里的局部变量非malloc出来的都是在栈中,有系统管理,在函数执行完后就清理了。。
所以malloc分配的,你要自己写free...free完后在把指针赋值NULL
函数里的局部变量非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"
}
#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"
}