首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 看看这道面试题? [已结贴,结贴人:fanlehai]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fanlehai
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-05-12 19:06:23 楼主
    void GetMemory( char *p )
    {
     p = (char *) malloc( 100 );
    }

    void Test( void )
    {
     char *str = NULL;
     GetMemory( str );
     strcpy( str, "hello world" );
    printf( str );
    }


    错在哪?说明原因……谢谢
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:20:071楼 得分:1
    void GetMemory( char *p )
    错在这里。
    要不**p
    要不&*p
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • arong1234
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:22:202楼 得分:1
    指针TYPE*能返回值,是指返回一个TYPE类型的值,而不是TYPE*类型的
    你要求返回的是char*的,必须用char**, char*类型的不可返回char*的值
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yao_zhuang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:31:103楼 得分:1
    指针问题,你要改变的是作为形参的指针的值,应该用**p,如果是C++的话&*p
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jintianfree
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:34:354楼 得分:1
    引用 1 楼 lin_style 的回复:
    void GetMemory( char *p ) 
    错在这里。
    要不**p
    要不&*p


    正解

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jieao111
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:47:415楼 得分:1
    baidu  二级指针
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jintianfree
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:52:156楼 得分:5
    C/C++ code
    void GetMemory( char **p ) {  *p = (char *) malloc( 100 ); } void Test( void ) {  char *str = NULL;  GetMemory(&str); strcpy( str, "hello world" ); printf( str ); }


    这样就对了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • dadatech
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 19:58:287楼 得分:1
    to 楼上
    加上如下语句才正确
    free(*str);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • leisu821
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 20:03:168楼 得分:0
    受教了,顶下~~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 20:09:069楼 得分:5
    我倒觉得,大家可以试试,改成**p,&*p都不对。
    其实,以我愚见,我觉得,应该这么理解:

    char *str = NULL;//根本没分配内存,只是一个声明而已,调试 一下,str = 0x00000000 , *str =CXX0030
    所以,你给函数getmemory传递过去的,也只是一个计算机不能辨识的东西,或者,说是根本就是一个什么也不是的东西,那么,在GetMemory中怎么执行呢?可以这么看,p也相当于一个声明,那么给p分配内存,一点问题没有,内存是分配了,那么函数返回之后呢,这个内存地址根本不复存在,或者在main中根本没能捕捉到这个地址,也就是str还是空。根本里面啥也没有,也没给它分配内存!

    程序这么改,就应该能明白:

    #include <stdlib.h>
    #include <stdio.h>
    char* GetMemory( char *p )
    {
    p = (char *) malloc( 100 );
    return p;
    }

    void main( void )
    {
    char *str = NULL;
    str = GetMemory( str );
    strcpy( str, "hello world" );
    printf( str );
    }

    不知道我说的对不对~!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 20:37:4910楼 得分:0
    这么改,估计更符合楼主意思:

    void GetMemory( char **p )
    {
    *p = (char *) malloc( 100 );
    }

    void main( void )
    {
    char* str = NULL;
    GetMemory( &str );
    strcpy( str, "hello world" );
    printf( str );
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kolige
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 20:41:0711楼 得分:5
    很多人都说了,我也来唠叨一下,要明白这个首先要知道指针变量和指针变量的地址是不同的。

    在你原来那个程序中
    void Test( void )
    {
     char *str = NULL;
     GetMemory( str );
     strcpy( str, "hello world" );
      printf( str );
    }
    这个str是一个指针变量,是有内存空间的,假设其地址为 1000,其内容为NULL;
    那么在调用GetMemory( str )的时候,并不是你所希望的把1000这个地址传进去了,而是构造了一个临时指针变量,这个指针变量的地址我们假设为 3000,和原来的地址没有任何关系,当程序运行了
    void GetMemory( char *p )
    {
     p = (char *) malloc( 100 );
    }
    这时改变的是地址为 3000 的指针的内容,把这个内容改为用malloc创造出来的一个地址。然后程序返回,这样一来就没有改变原来地址为1000的指针变量的内容。
    在传参数的时候可以使用**p或者&*p实现。
    具体实现方法6楼已经说了。
    至于9楼的,如果在VC++里面,用new就可以实现。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • leisu821
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 20:42:2612楼 得分:1
    void main( void ) 
    {
        char* str = (char *) malloc( 100 );
        strcpy( str, "hello world" );
        printf( str );
    }

    这么改呢?-_,-
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zsxcn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 20:58:0513楼 得分:2
    void GetMemory( char * &p )
    {
     p = (char *) malloc( 100 );
    }

    void Test( void )
    {
     char *str = NULL;
     GetMemory( str );
     strcpy( str, "hello world" );
    printf( str );
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • PcrazyC
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:05:1214楼 得分:1
    传递指针只能改变指针指向的内存,只有传递指针的地址才能改变指针
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • PcrazyC
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:16:4915楼 得分:1
    指针和一个普通变量是一样的,记住这就可以了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • queshangxintou
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:18:3216楼 得分:1
    o(∩_∩)o...哈哈 还有一个问题
    内存泄露
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lin_style
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:19:4317楼 得分:1
    没那么复杂, 15楼解释最简单

    void fun(int a)
    {
      a=4;//这样能改变a的值吗
    }

    指针也是一样道理,注意,指针的值和对指针的值操作不一样,不要混淆了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • queshangxintou
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:28:4318楼 得分:1
    推荐楼主看一本书 林锐的 C++高质量编程
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbc122
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:54:1119楼 得分:1
    引用 4 楼 jintianfree 的回复:
    引用 1 楼 lin_style 的回复:
    void GetMemory( char *p ) 
    错在这里。 
    要不**p 
    要不&*p


    正解
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chen_yuan
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 21:58:5320楼 得分:1
    C/C++ code
    是值传递和地址传递的问题。 楼主的题目用的是值传递,在void GetMemory( char *p ) 函数中,会产生p的副本指针(_p),在函数内的一切操作只是在副本中起作用,而p没有丝毫的改变,也就没有起到分配内存的作用了。 void GetMemory( char *p )中的char *p改成:char **p,主函数中传GetMemory(& str); 或改成char *&p,主函数中传GetMemory(str);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chen_yuan
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 22:00:0521楼 得分:1
    是值传递和地址传递的问题。
    楼主的题目用的是值传递,在void GetMemory( char *p ) 函数中,
    会产生p的副本指针(_p),在函数内的一切操作只是在副本中起作用,
    而p没有丝毫的改变,也就没有起到分配内存的作用了。
    void GetMemory( char *p )中的char *p改成:char **p,主函数中传GetMemory(& str);
    或改成char *&p,主函数中传GetMemory(str);

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • kendy_ke
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 22:07:0022楼 得分:2
    char *GetMemory( )
    {
     return (char *) malloc( 100 );
    }

    void Test( void ) 
    {
     char *str = NULL;
     str = GetMemory(); 
     strcpy( str, "hello world" );
      printf( str );
      free(str);//别忘记了....
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lixun_21
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 22:24:1423楼 得分:0
    帮顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • newredhat
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-12 23:16:3724楼 得分:0
    指针问题
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • haisujiang
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 06:48:4025楼 得分:0
    指针变量作为形参,是不会被子函数修改的!!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaoc10
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 08:07:3626楼 得分:0
    传的是值,你应该要传地址过去。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • blackant2
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 09:12:0727楼 得分:0
    回帖是一种美德!传说每天回帖即可获得 10 分可用分! 连续两周技术区参与者,每周额外可以获得88个可用分
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xumintt
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 09:43:0128楼 得分:3
    void GetMemory( char &*p )
    {
     p = (char *) malloc( 100*sizeof(char) );
    }

    void Test( void ) 
    {
     char *str = NULL;
     GetMemory( str ); 
      if(NULL==str)    //检查内存是否分配成功
        return 0;
     strcpy( str, "hello world" );
      printf( str );
      free(str);        //释放内存
      str=NULL;        //杜绝野指针
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • chrisphen
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 10:12:1229楼 得分:0
    同意六楼的
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • tncqsy
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-05-13 10:22:5030楼 得分:0
    引用 1 楼 lin_style 的回复:
    void GetMemory( char *p ) 
    错在这里。
    要不**p
    要不&*p


    正解
    修改