搜索
首页 电脑/网络 操作系统/系统故障

一个内存分配问题

  #include #include #include void GetMemory( char *p ) { p = (char *) malloc( 100 ); } void main( void ) { char *str = NULL; GetMemory( str ); strcpy( str, "hello world" ); printf( str ); } 为什么执行 GetMemory( str );后str并没有分配到内存,这是为什么求详细说明。
  

全部回答

2011-11-30

0 0
    str是一个指针型的变量,它的值是NULL,GetMemory( str )其实用的是str的值,也就是NULL,所以GetMemory( str );其实是GetMemory( NULL);我估计步进执行到 p = (char *) malloc( 100 ); 就会有错误,实模式下你已经将第零号中断的值给破坏了。
    注意,C语言是值传递,也就是只能有上一级程序将值传给被调用的函数,被调用的函数不能将值通过参数再传出来。如果非要把某个变量的值传到外面,唯一的办法就是把上一级程序的某个变量的地址提供给函数,函数将要穿出的写入这个地址,然后就出来了。
    当然你这个函数只需要返回一个值,也可以用return来实现,也就是写成str =GetMemory( )的形式(是不是眼熟?) 正确是做法是 void GetMemory( char **p ) { *p = (char *) malloc( 100 );/*p是str的地址,*p就是往这个地址里写入分配到内存的地址*/ } void main( void ) { char *str = NULL; GetMemory( &str ); /*取str的地址/* strcpy( str, "hello world" ); printf( str ); } 或者 void GetMemory( char **p ) { return (char *) malloc( 100 ); } void main( void ) { char *str = GetMemory( ); strcpy( str, "hello world" ); printf( str ); } 程序没有调试,可能有错误仅作示例 。
  

2011-11-29

49 0
    void GetMemory( char *p ) { p = (char *) malloc( 100 ); } 这里p是个字符存储区指针,指向一段内存存储区,系统申请后,将该存储区的地址赋给了p;但是由于p是个值变量,在函数返回后就不再起作用,因此,在函数返回后,并不将指针传递给变量str; void main( void ) { char *str = NULL; GetMemory( str ); //这是个传值参数,将str变量所报存的内存指针传递给形式参数 //由于str=NULL;因此传递给p的值是NULL strcpy( str, "hello world" ); //由于值参不能影响变量的值,因此这里返回后,str=NULL printf( str ); } 你这段代码存在的问题标明:你还没有真正理解传值和传地址的区别:传值就是将变量的值传递给目标参数,传地址就是将变量的地址传递给目标参数 你这样修改: void GetMemory( char **p ) { *p = (char *) malloc( 100 ); //将申请到的字符串指针传递给由p指向的变量, //也就是给str赋值 } void main( void ) { char *str = NULL; GetMemory( &str ); //将变量str的地址传递给目标参数 strcpy( str, "hello world" ); printf( str ); free(str); //由于你申请了空间,用完后必须释放,否则在函数多次调用后//会出现内存泄漏的危险,最终导致没有内存而是程序崩溃,一//定要养成这样的习惯,否则程序的健壮性的得不到保证 } 。
    。

2011-11-29

51 0
    str是一个指针型的变量,它的值是NULL,GetMemory( str )其实用的是str的值,也就是NULL,所以GetMemory( str );其实是GetMemory( NULL);我估计步进执行到 p = (char *) malloc( 100 ); 就会有错误,实模式下你已经将第零号中断的值给破坏了。
    注意,C语言是值传递,也就是只能有上一级程序将值传给被调用的函数,被调用的函数不能将值通过参数再传出来。如果非要把某个变量的值传到外面,唯一的办法就是把上一级程序的某个变量的地址提供给函数,函数将要穿出的写入这个地址,然后就出来了。
    当然你这个函数只需要返回一个值,也可以用return来实现,也就是写成str =GetMemory( )的形式(是不是眼熟?) 正确是做法是 void GetMemory( char **p ) { *p = (char *) malloc( 100 );/*p是str的地址,*p就是往这个地址里写入分配到内存的地址*/ } void main( void ) { char *str = NULL; GetMemory( &str ); /*取str的地址/* strcpy( str, "hello world" ); printf( str ); } 或者 void GetMemory( char **p ) { return (char *) malloc( 100 ); } void main( void ) { char *str = GetMemory( ); strcpy( str, "hello world" ); printf( str ); } 程序没有调试,可能有错误仅作示例。
  

类似问题换一批

热点推荐

热度TOP

相关推荐
加载中...

热点搜索 换一换

电脑/网络
操作系统/系统故障
硬件
电脑装机
程序设计
互联网
笔记本电脑
反病毒
百度
软件
操作系统/系统故障
操作系统/系统故障
举报
举报原因(必选):
取消确定举报