Chinaunix

标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!! [打印本页]

作者: boylitao    时间: 2004-09-07 17:54
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
#include <stdio.h>;

void fun(char  **p)
{
        int i,j;
       
        p=(char **)malloc(sizeof(char *)*4);       
               
               
                for(i=0;i<4;i++)
                p=(char *)malloc(sizeof(char)*40);
               
               

        strcpy(p[0],"test1";
        strcpy(p[1],"test2";
        strcpy(p[2],"test3";
        strcpy(p[3],"test4";
        for(i=0;i<4;i++)
                printf("p[%d] is [%s]\n",i,p);
               
       
       
}

void main()
{
        char **pp;
        int i;
       
        fun(pp);
        for(i=0;i<4;i++)
                printf("pp[%d] is [%s]\n",i,pp);
               
       
       
}

为什么pp打印的值是null。。

谢谢!!!!
作者: alarum    时间: 2004-09-07 18:19
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
2级指针也是变量,fun()只是修改了pp的副本,没有改变pp本身。
作者: A0110A    时间: 2004-09-07 18:31
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
需要传入pp的地址。
作者: boylitao    时间: 2004-09-07 18:36
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
能说明白一些吗?
帮忙修改一下
作者: aXe    时间: 2004-09-07 19:58
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
最简单的办法,
#include <stdio.h>;

char** fun()
{
int i,j;
char **p;
p=(char **)malloc(sizeof(char *)*4);


for(i=0;i<4;i++)
p=(char *)malloc(sizeof(char)*40);



strcpy(p[0],"test1";
strcpy(p[1],"test2";
strcpy(p[2],"test3";
strcpy(p[3],"test4";
for(i=0;i<4;i++)
printf("p[%d] is [%s]\n",i,p);


return p;
}

void main()
{
char **pp;
int i;

pp = fun();
for(i=0;i<4;i++)
printf("pp[%d] is [%s]\n",i,pp);



}
作者: step_by_step    时间: 2004-09-07 20:09
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
用指针的引用不就得了?
作者: boylitao    时间: 2004-09-07 20:17
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
返回值的方法我知道了
但是通过参数的方法就是不行

另外
char **p;

char s[7][80];

p=str;

这样复制怎么不行啊
作者: A0110A    时间: 2004-09-08 08:50
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
#include <stdio.h>;

void fun(char ***pp)  //??
{
char **p=*pp;    //??
int i,j;

p=(char **)malloc(sizeof(char *)*4);


for(i=0;i<4;i++)
p=(char *)malloc(sizeof(char)*40);



strcpy(p[0],"test1";
strcpy(p[1],"test2";
strcpy(p[2],"test3";
strcpy(p[3],"test4";
for(i=0;i<4;i++)
printf("p[%d] is [%s]\n",i,p);



}

void main()
{
char **pp;
int i;

fun(&pp); //???
for(i=0;i<4;i++)
printf("pp[%d] is [%s]\n",i,pp);



}
作者: aero    时间: 2004-09-08 08:52
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
C语言的函数是值传递,不管这个变量是什么,都不能改变,但是,这个变量如果是个地址,那么从这个地址找到的数据就可以改变,但是由于这个地址是这个变量的值,所以这个地址也就不能改变。

呵呵,其实,根本不用记入门书中的什么参数不能改变,传指针可以改变等等。只要记住:值传递,参数不能改变就好了。指针也是一种参数,所以不能改变,但指针指的数据就不是参数了,所以就可以改变。

原则是简单的,C追求的也是简单。
作者: zjqyb    时间: 2004-09-08 09:48
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
#include <stdio.h>;
void fun(char ***p)
{
int i,j;
char **p1=(char **)malloc(4);

for(i=0;i<4;i++)
p1=(char *)malloc(sizeof(char)*40);
strcpy(p1[0],"test1";
strcpy(p1[1],"test2";
strcpy(p1[2],"test3";
strcpy(p1[3],"test4";
for(i=0;i<4;i++)
printf("p[%d] is [%s]\n",i,p1);
*p=p1;
}

void main()
{
char **pp;
int i;

fun(&pp);

for(i=0;i<4;i++)
printf("pp[%d] is [%s]\n",i,(char **)pp);
}
作者: wufeiwf    时间: 2004-09-08 12:39
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
原帖由 "aero" 发表:
C语言的函数是值传递,不管这个变量是什么,都不能改变,但是,这个变量如果是个地址,那么从这个地址找到的数据就可以改变,但是由于这个地址是这个变量的值,所以这个地址也就不能改变。

呵呵,其实,根本不用?.........


精辟!
作者: boylitao    时间: 2004-09-08 13:51
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
char **p;

char s[7][80];

p=str;

这样复制怎么不行啊!!!!!!!!!!!!!!!
作者: boylitao    时间: 2004-09-08 14:03
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
多谢zjqyb的启发
我的程序问题解决了。
#include <stdio.h>;
void fun(char ***p)
{
int i,j;

*p=(char **)malloc(sizeof(char *)*4);

for(i=0;i<4;i++)
(*p)=(char *)malloc(sizeof(char)*40);
strcpy((*p)[0],"test1";
strcpy((*p)[1],"test2";
strcpy((*p)[2],"test3";
strcpy((*p)[3],"test4";
for(i=0;i<4;i++)
printf("p[%d] is [%s]\n",i,(*p));
}

void main()
{
char ***pp;
int i;
fun(pp);

for(i=0;i<4;i++)
printf("pp[%d] is [%s]\n",i,(*pp));
}
作者: walkfire    时间: 2004-09-08 14:57
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
#include <stdio.h>;

void fun(char ***p)
{
        int i=0;

        *p=(char **)malloc(sizeof(char *)*4);

        for(i=0;i<4;i++)
        (*p)=(char *)malloc(sizeof(char)*40);

        strcpy((*p)[0],"test1";
        strcpy((*p)[1],"test2";
        strcpy((*p)[2],"test3";
        strcpy((*p)[3],"test4";
        for(i=0;i<4;i++)
        printf("p[%d] is [%s]\n",i,(*p));
}

void main()
{
        char **pp;
        int i;

        fun(&pp);
        for(i=0;i<4;i++)
        printf("pp[%d] is [%s]\n",i,pp);
        exit(0);
}
作者: boylitao    时间: 2004-09-08 15:39
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
还忘了释放内存了
不知道释放内存的顺序是怎样的。
从外向里释放
作者: aero    时间: 2004-09-08 15:58
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
没有顺序,用malloc和calloc申请的内存就一定要释放那个指针。
作者: boylitao    时间: 2004-09-08 16:37
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
char **p;

char s[7][80];

p=str;

这样复制怎么不行啊!!!!!!!!!!!!!!!

对于
int fun(char **p)

main()
{
    char s[3][4];

     fun(s)
....
}
也不行啊
作者: aero    时间: 2004-09-08 16:59
标题: 快看啊,多层指针传递问题!!!!!!!!!!!!!!
当然不行了,数组名是一个值(不是指针),怎么可以给一个值开辟空间呢?你在fun里面是要开辟空间的!你开辟了空间,那main里面的数组空间怎么办?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2