【问题标题】:pushing into stack from function in C从C中的函数推入堆栈
【发布时间】:2019-01-21 11:20:29
【问题描述】:

在我的测试函数中,我试图将两个值推入我的堆栈。它在 main() 中运行良好,但我认为在使用 testfunc() 时我弄乱了指针?

这些值到达 push() 函数,但这些值根本没有出现在我的堆栈中。

提前感谢您的帮助

struct StackNode
    {
        unsigned int data;
        struct StackNode* next;
    };

    struct StackNode* newNode(unsigned int data)
    {
        struct StackNode* stackNode =
                  (struct StackNode*) malloc(sizeof(struct StackNode));
        stackNode->data = data;
        stackNode->next = NULL;

        return stackNode;
    }

    int isEmpty(struct StackNode *root)
    {
        return !root;
    }

    void push(struct StackNode** root, unsigned int data)
    {
        struct StackNode* stackNode = newNode(data);
        stackNode->next = *root;
        *root = stackNode;
        printf("%u pushed to stack\n", data);
    }

    void pop(struct StackNode** root)
    {
        if (isEmpty(*root))
            printf("ERROR");
        struct StackNode* temp = *root;
        *root = (*root)->next;
        free(temp);

    }

    unsigned int peek(struct StackNode* root)
    {
        if (isEmpty(root))
            return -2;
        return root->data;
    }
void testfunc(struct StackNode* root, unsigned int a, unsigned int b) 
{
       struct StackNode *r=root;
       push(&r, a);
       push(&r, b); 
    }

主要

int main()
    {
        struct StackNode* root = NULL;
        push(&root,0); // Works well and pushes "0" to the stack.

        testfunc(root,12,15); // <-- doesn't push any value in the stack
}

【问题讨论】:

  • 简单地说:除非您打算通过该参数返回一个指针,否则不要使用指针到指针。而且没有真正的理由需要传递StackNode**。如果您将所有分配和硬拷贝都放在堆栈 ADT 中并且根本不向调用者公开任何内部结构会更好。

标签: c function pointers stack push


【解决方案1】:

您的push 函数修改了根:

*root = stackNode;

在您的testfunc 中,对函数本地的root 变量进行了此更改。 IE。在调用函数 (main) 中不会看到对它的任何更改。所以,从main 的角度来看,好像什么都没有改变,因为那里的root 变量没有改变。

要确保在testfunc 中对root 的更改在main 中也可见,您可以例如。归还:

struct StackNode* testfunc(struct StackNode* root, unsigned int a, unsigned int b) 
{
   push(&root, a);
   push(&root, b);
   return root;
}

root = testfunc(root, 12, 15);

或者,您可以:

void testfunc(struct StackNode** root, unsigned int a, unsigned int b) 
{
   push(root, a);
   push(root, b);
}

testfunc(&root, 12, 15);

【讨论】:

  • 桑德是正确的。一方面..我还要指出您的peek 函数正在向unsigned int..返回否定值。您的编译器应该对此发出警告。
  • 非常感谢,您的建议已解决。无论如何,我可能会像 Lundin 所写的那样完全摆脱指针对指针。编辑:哦,谢谢 dutchRooster,我知道 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 2018-12-30
  • 2017-06-16
  • 2017-11-20
  • 2020-05-27
相关资源
最近更新 更多