[英]C linked list stack and pointers
我是C的新手,我正在尝试使用链表实现堆栈。 目前设置Stack,到目前为止一切都很好。 当我尝试将新节点推送到列表时,问题就出现了。 我现在有
在main()
, push()
被调用:
push(&(s.head), 'r');
功能push
是:
void push(StackNodePtr *topPtr, char value){
printf("topPtr value %c", (*topPtr)->data); // - Is currently 'p'
StackNodePtr sNP;
sNP = malloc(Node_Size);
sNP->data = value; // - Is currently 'r'
sNP->nextPtr = *topPtr;
printf("\nsNP value - %c", sNP->nextPtr->data); // Prints p... cool
topPtr = &sNP; // Just assigned it???
printf("\ntopPtr at end of push = %c", (*topPtr)->data); // prints r... cool
// WHY YOU NO REFERENCE sNP LATER!?!?
}
同时,回到主要:
printf("\non the stack...%c", stackTop(s.head)); // prints 'p'
它似乎在push中工作正常,但我在topPtr
指向的节点上调用printf()
,而topPtr
曾经打印出来的值(在本例中为'p')。 据我所知,从我所做的狩猎来看,它的外观和感觉都是正确的,我不知道我错过了什么。
可能是我做过topPtr = &sNP;
?
朝着正确方向的任何“推动”都是一个很好的推动......
topPtr = &sNP; // Just assigned it???
此功能在功能外部不可见。 topPtr
按值传递,即,它的副本被生成并传递给函数。 因此,分配不同的值只会修改副本; 原始参数仍然指向旧的内存位置。
如果需要以这种方式修改参数,则需要另一级别的间接,即采用StackNodePtr**
。
另外,我假设StackNodePtr
是StackNode*
的typedef
。 我是对的吗? 是否有一个良好的理由typedef
这个指针类型? 通常它只是使事情复杂化。 我建议typedef
“荷兰国际集团,只有当它是真正的不透明类型(即指针类型HANDLE
在Windows上)。
它应该是
*topPtr = sNP;
这样,原始头,调用者已经通过指针,成为新头的下一个,正确地“覆盖”,并且调用者具有指向新头的正确指针。
你的函数push正在修改指针topPtr。 由于C是按值传递的,因此将头作为值传递,并且传递的副本在push中被修改。 因此,要修改指针本身,需要将指针传递给指针。 此外,需要更正函数push()签名以传入指向指针的指针。 最后,需要更正push中的topPtr赋值,如代码片段所示。
进行以下更改:
push(&(s.head), 'r'); // pass pointer to pointer, assuming head is pointer, it should be fine
void push(StackNodePtr **topPtr, char value){ // make first argument pointer to pointer.
StackNodePtr sNP;
sNP = malloc(Node_Size);
sNP->data = value;
sNP->nextPtr = *topPtr;
*topPtr = &sNP; <------*topPtr needs to be assigned.
}
topPtr = &sNP; // Just assigned it???
不,你没有。 您将值分配给指针的本地副本。 你改变了topPtr
本身的价值,它不会出现在外面。 相反,您应该写入它指向的位置:
*topPtr = sNP;
它看起来就像这里的bug:topPtr =&sNP; //刚刚分配了???
而不是推回返虚空。 改变它以返回堆栈的新头。 返回sNp;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.