首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

指针传递有关问题

2012-03-01 
指针传递问题!请大家帮忙!我在学习数据结构,做书上的关于链栈的定义。却出现了一个搞不懂的问题,就是指针传

指针传递问题!
请大家帮忙!
我在学习数据结构,做书上的关于链栈的定义。却出现了一个搞不懂的问题,就是指针传递的问题,大家看一下代码:
……
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))
…… 
}
[解决办法]

C/C++ code
BOOL Init(LStack *s) {   LStack *n;   n = (LStack*)malloc(sizeof(LStack));   if(!n)     return FALSE;   s = n;    //在这里发现s已经被分配内存   return TRUE; } //这里面只是局部变量s指向了刚分配的堆内存,而你主函数里面的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++ 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,来对
指针的实质对象进行处理了。

。。。。总结楼上,。。。。。

顶起

热点排行