C

时间:2019-04-28 00:31:15

标签: c pointers struct stack

我已经在C语言中创建了一个Stack结构。当使用值初始化堆栈时,我可以将其打印回来并接收正确的输出。但是,在推入新字符串之后,打印功能将打印出看起来像是随机字符的字符(ASCII 177)。

最初,我使用指针实现了该项目,但无法使其正常工作。相反,我选择仅对Node *nodes的{​​{1}}成员使用指针。这样,当我需要增加堆栈时,只需将所需的内存量乘以Stack。但是,这种方法也行不通。

Stack.size

这些用法如下:

#define MAX_DATA 64
struct Node{
    char val[MAX_DATA];
};

struct Stack{
    int size;
    struct Node *nodes;
};

struct Node node = {.val = "Test"}; struct Stack stack = newStack(node); printStack(stack); 函数正确初始化newStack。为了包含:

nodes

然后在struct Stack newStack(struct Node node) { struct Stack stack; stack.size = 1; stack.nodes = (struct Node*) malloc(sizeof(struct Node)); stack.nodes[0] = node; return stack; } 中迭代打印堆栈,其中printStack()是for循环的上限。

当我尝试运行时会遇到麻烦:

stack.size

push函数旨在创建一个临时堆栈并将堆栈的值分配给它。之后,struct Node node2 = {.val = "Test1"}; push(stack, node2); printStack(stack); 递增,size的指针被释放,并分配新的内存,最后有空间容纳新成员。

nodes

不用说,这不能正确执行。

预期输出为:

void push(struct Stack stack, struct Node node)
{
    struct Stack temp_stack = stack;
    stack.size += 1;
    free(stack.nodes);
    stack.nodes = (struct Node*) malloc(sizeof(struct Node) * stack.size);
    for(int i = 0; i < temp_stack.size; i++){
        stack.nodes[i] = temp_stack.nodes[i];
    }
    stack.nodes[stack.size - 1] = node;
}

但是,相反,我只收到ASCII-177。还值得注意的是,执行在打印并移至新行后挂起。结果为Test Test1

我不正确地释放和重新分配了内存吗?任何帮助,将不胜感激。预先谢谢你!

2 个答案:

答案 0 :(得分:0)

值得记住的是,在C语言中,将结构体传递给函数是按值传递,即该函数获得该结构体的副本。该结构的所有成员(包括指针变量(但不包括指针引用))都是重复的。

因此,在push函数中,请考虑修改该副本时(例如stack.size += 1以及free() stack.nodes时,原始文档会发生什么情况。

答案 1 :(得分:0)

感谢peekay的建议。我最终做了一个重写。它变得相当简单。我确实通过将节点存储为指针来删除了“可见性”层,但是我认为这种实现对数据结构更真实。

节点是作为保存数据的一种方式实现的,用户不会直接与其交互。它还指向以下节点。实现堆栈的目的是保存顶部节点,以及堆栈的大小。

节点:

struct Node{
    char val[MAX_DATA];
    struct Node *next;
};

堆栈:

struct Stack{
    struct Node *top;
    int size;
};

推送:

void push(struct Stack *stack, char *newVal)
{
    struct Node *newNode;
    newNode = (struct Node*) malloc(sizeof(struct Node));
    strcpy(newNode->val, newVal);
    newNode->next = stack->top;
    stack->top = newNode;
    stack->size++;
}

用法:

struct Stack stack;
newStack(&stack);

push(&stack, "Test");
push(&stack, "Test1");
push(&stack, "Test2");
push(&stack, "Test3");

Complete Code

Updated, accessible Nodes