| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 806 人关注过本帖
标题:关于指针参数的问题
只看楼主 加入收藏
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
结帖率:100%
收藏
已结贴  问题点数:30 回复次数:8 
关于指针参数的问题
  void Func(char *p)
{
    p = (char *)malloc(10*sizeof(char));
    memset(p,0,10*sizeof(char));
}

int main()
{
    char *p = NULL;
    Func(p);
    if(p == NULL)
    {
        printf("Error!\n");
        return(-1);
    }
    strcpy(p,"hello!");
    printf("%s\n",p);
    return (0);
}
 看到一本C语言的参考书上说,这个Func函数不能把malloc生成的内存返回给主函数的指针p,是因为Func函数采用的是传值的方式进行参数的传递的。因此,在题中传给Func函数的参数p,是主函数中p的一个拷贝,假设是p'。生成的内存也是赋给这个拷贝p'的,而一旦推出Func函数,这个拷贝p'便被编译器收回了,所以主函数中的p并没有得到malloc生成内存的首地址。但是下面的情况为什么可以呢:
typedef struct node
{
    void *pnode;
    void *phandle;
}node_t;


int Func(void *pinit)
{
    node_t *pInst = (node_t *)pinit;
    pInst->pnode = malloc(10*sizeof(char));
    if(NULL == pInst->pnode)
    {
        printf("Error: NULL == pInst->pnode!\n");
        return (-1);
    }
    memset(pInst->pnode,0,10*sizeof(char));
    return (0);
}


int main()
{
    int ret =0;
    node_t *pInst = NULL;
    pInst = (node_t *)malloc(sizeof(node_t));
    if(NULL == pInst)
    {
        printf("Error:NULL == pInst!\n");
        return (-1);
    }

    ret = Func(pInst);
    if(ret < 0)
    {
        printf("Error : ret < 0!\n");
        return (-1);
    }

    if(pInst->pnode == NULL)
    {
        printf("Error: In main,pInst->pnode == NULL!\n");
        return (-1);
    }

    strcpy(pInst->pnode,"Hello!\n");
    printf("%s\n",pInst->pnode);
    return(0);
 }
照书上说的,传给Func函数的也应该是一个拷贝啊,为什么在里面malloc生成的内存,main函数中可以使用呢!
问了不少人了,都没得到什么有价值的回答。希望论坛里的大家能给小弟指点迷津,不甚感激啊!
搜索更多相关主题的帖子: 指针 参数 
2010-07-19 16:47
kingsroot
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:284
专家分:1159
注 册:2010-3-28
收藏
得分:5 
原因很简单的,第一个例子修改了p的值(即复制前后的2个指针指向了不同地址,一个指向NULL,一个指向了分配的地址),而第二个例子没有修改pInst的值(即复制前后2个指针都是指向同一个内存地址的),所以第二个是正确的
2010-07-19 17:01
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
回复 2楼 kingsroot
仅仅是因为指向的地址不一样而造成的这样的结果吗?如果按照书上说传值的方式进行的参数传递,不是后面的这个函数Func接收到的参数也是一个拷贝的值啊,这个值不会在退出Func的时候被收回吗?!
希望 kingsroot能够再指点迷津一次,谢谢了!

[ 本帖最后由 erikyo 于 2010-7-19 19:23 编辑 ]
2010-07-19 18:39
yjchaos
Rank: 2
等 级:论坛游民
帖 子:16
专家分:36
注 册:2010-7-4
收藏
得分:0 
第一个例子的Func函数是void类型的,无返回值。所以第一个例子把void Func(char *p)改为char *Func(char *p),在把主函数中Func(p);改为p=Func(p);就对了。第二个例子的Func函数是int型的,有返回值,当NULL == pInst->pnode时返回0,其他情况返回-1,主函数中ret = Func(pInst)就是将Func函数的返回值赋予ret
2010-07-19 19:37
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
回复 4楼 yjchaos
关于返回值的这个情况我是知道的,但是这并不能解释后面这种情况,malloc生成的内存可以返回到主函数之中使用啊。
因为后面的返回值(0或是-1)只是用来判断在Func函数中malloc是否成功而已啊!
2010-07-19 19:56
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1685
专家分:4252
注 册:2007-12-27
收藏
得分:25 
你的Func收到的参数pinit是一个指针,它指向什么呢?
指向主函数里面那个malloc开辟出来的空间,那里面的内容是主函数里面很容易找到的。
接下来,Func里面的pInst也得到了赋值,从而它也指向上面那句话所说的空间。
再往下,Func里面的malloc分配空间,首地址送给谁了呢?pInst->pNode
这个pNode可不是Func里面的形参或者局部变量啊,它本来就存在我第二句话说的那个空间中。
然后...就没问题了吧?

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-07-19 20:17
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
收藏
得分:0 
回复 6楼 forever74
谢谢斑竹的回答,现在在弄明白了!
还要继续努力啊!
2010-07-19 20:31
快速回复:关于指针参数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017765 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved