注册 登录
编程论坛 C++教室

指针问题,还是不懂

jjg 发布于 2010-10-14 13:23, 556 次点击
为什么这段代码有问题:
void GetMemory(char *p)
{
    p=(char*)malloc(100);  //为什么这里修改p的值是并不能真正修改实参的值,讲解详细点
}
void Text(void)
{
    char* str=NULL;
    GetMemory(str);

    strcpy(str,"hollo");
    printf(str);
}
下面这两段代码都正确:
void GetMemory(char **p)
{
    *p=(char*)malloc(100);
}
void Text(void)
{
    char* str=NULL;
    GetMemory(str);
    strcpy(&str,"hollo");
    printf(str);
}




char* GetMemory(char *p)
{
    p=(char*)malloc(100);
    return p;
}
void Text(void)
{
    char* str=NULL;
    str=GetMemory(str);
    strcpy(str,"hollo");
    printf(str);
}
7 回复
#2
聋眼睛瞎耳朵2010-10-14 13:42
这应该说是一个参数传递的问题。
实参传递给形参,只在函数被调用时,才给形参分配内存单元,接收从实参传递过来的值,在函数调用结束后,将释放其所分配的内存单元。所以修改形参的值不会对实参造成影响。
#3
jjg2010-10-14 16:06
回复 2楼 聋眼睛瞎耳朵
形参会分配内存吗?只有实参才会分配吧
#4
jjg2010-10-14 16:08
查了下,会
#5
m21wo2010-10-14 16:17
p=(char*)malloc(100);这里修改p的值是并不能真正修改实参的值???  这只是为字符指针申请100个字节的内存啊!!什么修改实参,什么意思!
#6
jjg2010-10-14 17:22
我知道怎么回事了,还是那句老话,传地址可以修改值,而传值却不行
#7
pangge2010-10-14 21:57
这个就是一般的参数传递问题,当你的函数参数是值传递方式传给形参后(注意在内存中,形参是分配在栈中的),函数一结束,内存中的形参就被释放,因为无返回值。解决方法可以用引用(&+引用参数名),或者用LZ第二段的正确程序把形参做成二维指针即可(如:void GetMemory(char **p)
)。
#8
pangding2010-10-14 22:43
多年不见,差点不知道什么是形参什么是实参了……
1