我已经在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
。
我不正确地释放和重新分配了内存吗?任何帮助,将不胜感激。预先谢谢你!
答案 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");