2013-05-20 30 views
0

我目前正在做一个C语言任务,这是我第一次真正理解指针。我大部分都是掌握了它,但它将我抛到了最底层(至少在我眼中),而且我遇到了一种情况。如何在C函数中设置未初始化指针的值?

我有一个指向结构structPtr的指针,其中包含指向链表((headPtr).nextNode等的头节点的指针headPtr)。

现在我通过一个函数向这个列表添加节点,但是我的问题是当我第一次设置头节点时,我只能用(*structPtr).headPtr = &newNode来设置它。但是这是在功能范围内,并且测试似乎告诉我,在功能结束后,将转储新节点&。我想要做(*(*structPtr).headPtr) = newNode,但这会导致分段错误,即使我设置了(*structPtr).headPtr = NULL

任何指导?

+3

显示您的代码。 –

+0

我会假设你没有为structPtr分配内存,但向我们展示代码 – Salgar

+0

@Salgar看起来你是对的。对不起有一段代码要显示,所以我用一个(非常)基本的总结来解决。它似乎无论如何工作。 – andrewb

回答

3

如果指针在函数外部使用,则不能使用指向局部变量的指针。所有局部变量都位于堆栈上,并且函数返回时该堆栈的部分将被回收,并将在下一次函数调用时重用。

您需要动态分配函数内部的结构, malloc

structPtr->headPtr = malloc(sizeof(*structPtr->headPtr)); 

不要忘记free的mermory当你用它做。

+0

这太好了 - 我已经设法在函数外部的* headPtr中访问一个值,所以看起来像是在工作。我使用了你提供的那一行代码,后面跟着我以前想要做的(*(* structPtr).headPtr)= newNode。不过,它之后不久就崩溃了,这可能是由于这段代码实际上正常工作造成的其他一些错误。在我将您的答案标记为正确之前,让我跟踪完成这个错误。 – andrewb

+0

它正在崩溃,因为你试图访问不属于你的东西。现在你在实现Joachim的想法之前访问它之前要求内存:) –

+0

是的,我认为我看到了它的需要。尽管我的下一部分似乎并不需要它,尽管它再次在函数中设置了一个新变量。也许手动设置一个节点使我不必担心链表的其余部分。 – andrewb