指针传入函数不重新分配

时间:2016-10-24 20:45:50

标签: c pointers linked-list stack

所以我试图实现一个链接列表堆栈,它接受char参数并将它们添加到链接列表中,并使用ascii代码作为节点的值。

我将我的nstack指针传入我的push函数并重新分配给new_node以创建一个新的top,但我的push函数似乎没有重新分配我的nstack节点 - 它只打印最初初始化的nstack值。为什么不重新分配nstack?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list_node {
    int element;
    struct list_node * pnext;
};

void push(struct list_node *operators, int e);

int pop(struct list_node *operators);


int main(int argc, char *argv[]) {
    int newvalue = (int)argv[1][0];
    struct list_node * nstack = (struct list_node*)malloc(sizeof(struct list_node));

    nstack->element = newvalue;
    nstack->pnext = NULL;
    int i;  
        for (i = 2; i < argc; i++) {
            push(nstack, (int)argv[i][0]);
        }
    printf("top: %d\n", nstack->element);
}

void push(struct list_node *nstack, int e) {
    struct list_node * new_node = (struct list_node*)malloc(sizeof(struct list_node));
    new_node->pnext = nstack;
    new_node->element = e;
    nstack = new_node;
}

2 个答案:

答案 0 :(得分:1)

因为您传递的是指针的副本(按值)。你需要这样的东西(指针指针):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct list_node {
    int element;
    struct list_node * pnext;
};

void push(struct list_node **operators, int e);

int pop(struct list_node *operators);


int main(int argc, char *argv[]) {
    //int newvalue = (int)argv[1][0];
    int newvalue = 1;
    struct list_node * nstack = (struct list_node*)malloc(sizeof(struct list_node));

    nstack->element = newvalue;
    nstack->pnext = NULL;

    int i;
        for (i = 2; i < 7; i++) {
            //push(nstack, (int)argv[i][0]);
            push(&nstack, i);
        }
    printf("top: %d\n", nstack->element);
}

void push(struct list_node **nstack, int e) {
    struct list_node * new_node = (struct list_node*)malloc(sizeof(struct list_node));
    new_node->pnext = *nstack;
    new_node->element = e;
    *nstack = new_node;
}

答案 1 :(得分:1)

扩展塔罗德的正确观点。调用函数正在做的是获取指针值的副本并将其放入堆栈或寄存器(依赖于编译器),然后将在推送功能中使用。但是,在推送功能中,您实际上在返回之前实际更改了此寄存器或堆栈位置中的值。但是当你返回调用函数时,基本上会丢弃这些信息(它弹出堆栈 - 或者,再次取决于编译器,使用寄存器来做其他事情)。解决这个问题的唯一方法就是传递指针的地址,并在你需要像Tarod所示的那样写入时将它推迟。