指针传递问题!
请大家帮忙!
我在学习数据结构,做书上的关于链栈的定义。却出现了一个搞不懂的问题,就是指针传递的问题,大家看一下代码:
……
BOOL Init(LStack *s)
{
LStack *n;
n = (LStack*)malloc(sizeof(LStack));
if(!n)
return FALSE;
s = n; //在这里发现s已经被分配内存
return TRUE;
}
main()
{
LStack *stack;
if(Init(stack)) //但在这里子函数返回后发现stack地址值非法
……
}
[解决办法]
BOOL Init(LStack **s)
{
LStack *n;
n = (LStack*)malloc(sizeof(LStack));
if(!n)
return FALSE;
*s = n;
return TRUE;
}
main()
{
LStack *stack;
if(Init(&stack))
……
}
[解决办法]
BOOL Init(LStack *s) { LStack *n; n = (LStack*)malloc(sizeof(LStack)); if(!n) return FALSE; s = n; //在这里发现s已经被分配内存 return TRUE; } //这里面只是局部变量s指向了刚分配的堆内存,而你主函数里面的stack仍然没有指向,是个非法值
[解决办法]
//当然是非法操作,这是试图用指针动态分配内存的一个问题
BOOL Init(LStack *s) //这里的*s只是*stack的一个副本,只有当*s的内容发生改变时才会使*stack发生改变.{ //否则不论s做任何改变对父本stack都不会产生任何的影响 LStack *n; //所以虽然s的地址指向了n但是*s(即内容)没有发生改变所以stack的地址没有发生改变,没有申请到内存 n = (LStack*)malloc(sizeof(LStack)); if(!n) return FALSE; s = n; //在这里发现s已经被分配内存 return TRUE; } main() { LStack *stack; if(Init(stack)) //再对非法地址上的内存进行操作,当然就报错了 …… }
[解决办法]
/当然是非法操作,这是试图用指针动态分配内存的一个问题
C/C++ code
BOOL Init(LStack *s) //这里的*s只是*stack的一个副本,只有当*s的内容发生改变时才会使*stack发生改变. { //否则不论s做任何改变对父本stack都不会产生任何的影响 LStack *n; //所以虽然s的地址指向了n但是*s(即内容)没有发生改变所以stack的地址没有发生改变,没有申请到内存 n = (LStack*)malloc(sizeof(LStack)); if(!n) return FALSE; s = n; //在这里发现s已经被分配内存 return TRUE; } main() { LStack *stack; if(Init(stack)) //再对非法地址上的内存进行操作,当然就报错了 …… }
[解决办法]
这边的问题是C/C++语言中关于函数的形参和实参间的结合问题。
所以,要想获得返回值,参数得定义为指针或引用类型,
要想获得一个地址,参数得定义为指针的指针。
[解决办法]
如楼上所说:
1、
想要传回地址的话就要用指针的指针或者指针的引用。
2、
想要只是用指针来传值的话,就要用*S=*N,来对
指针的实质对象进行处理了。
。。。。总结楼上,。。。。。
顶起