gpt4 book ai didi

c - 指向结构体的指针 C 中堆栈数据结构的实现

转载 作者:行者123 更新时间:2023-11-30 16:18:30 25 4
gpt4 key购买 nike

我已经用 C 创建了一个堆栈结构。当用一个值初始化堆栈时,我可以将其打印回来并接收正确的输出。但是,在推送新字符串后,打印函数会打印看似随机的字符 (ASCII 177)。

最初,我用指针实现了这个项目,但我无法让它工作。相反,我选择仅使用 StackNode *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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com