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

标签 c pointers struct stack

我已经用 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/

相关文章:

c - 在没有 Malloc 的情况下分配结构数组?

c - 将行解析为 ***char 时出现段错误

c - 传递函数 char 参数返回错误

c - 如何将整数分配给c中的指针?

使用结构的 C 程序无法正常工作

c - 在 3 位数字上使用逻辑或关系运算符进行素数测试

c - 字符常量中的多个字符

c - 如何使用 return 命令而不是 printf 来获得定义的 float 函数的相同输出?

c - 为什么 gethostbyname() 在不存在的主机名上不会失败?

c++ - 将 vector 分配给结构的 vector 字段