我已经用 C 创建了一个堆栈结构。当用一个值初始化堆栈时,我可以将其打印回来并接收正确的输出。但是,在推送新字符串后,打印函数会打印看似随机的字符 (ASCII 177)。
最初,我用指针实现了这个项目,但我无法让它工作。相反,我选择仅使用 Stack
的 Node *nodes
成员的指针。这样,当我需要增加堆栈时,我只需乘以 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
函数正确初始化节点
。为了纳入:
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()
中迭代打印堆栈,其中 stack.size
是 for 循环的上限。
当我尝试运行时,麻烦来了:
struct Node node2 = {.val = "Test1"};
push(stack, node2);
printStack(stack);
push函数的目的是创建一个临时栈并将栈中的值赋给它。此后,大小
递增,指向节点
的指针被释放,并分配新内存,并在末尾为新成员留有空间。
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;
}
不用说,这不能正确执行。
预期输出为:
Test
Test1
但是,我只收到 ASCII-177。还值得注意的是,执行在打印该内容并移动到新行后挂起。这会导致中止(核心转储)
。
我是否不正确地释放和重新分配内存?任何帮助,将不胜感激。预先感谢您!
最佳答案
值得记住的是,在 C 中,将结构传递给函数是按值传递,即函数获取该结构的副本。结构体的所有成员,包括指针变量(但不是指针引用的任何内容),都是重复的。
因此,在推送函数中,请考虑当您修改此副本时(例如 stack.size += 1
,以及当您 free()
stack.nodes 时)原始版本会发生什么。
关于c - 指向结构体的指针 C 中堆栈数据结构的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55886019/