初始化结构并在函数中分配其参数

时间:2019-03-07 18:13:11

标签: pointers struct

我已经进行了一些搜索,但似乎找不到确切的答案。似乎应该可以,但不能。这是我的代码:

typedef struct stack_strut {
    Item* top;
    int size;
}stack;

void initialize(stack* s) {
    s = (stack*)malloc(sizeof(stack));
    s->size = 0;
}

int main() {
    stack s;
    initialize(&s);
    return 0;
}

显然,这是一个精简版本。我的印象是,由于传递了指向该结构的指针,因此我能够修改该结构的内容,因此该函数内部的make更改应在返回后保留。如果我在initialize函数内使用一条print语句检查大小,则成功打印0。但是,如果在initialize返回后立即在main中使用另一个print语句,则s的大小现在是一个非常大的数字。是因为我没有在函数外部初始化s吗?我必须保持这种格式,因为我的教授提供的主要功能以相同的方式启动:

stack s;
initialize(&s);

1 个答案:

答案 0 :(得分:0)

问题是当您写s = (struct*)malloc(sizeof(strucy));时,它会覆盖指向s的指针,而您没有初始化“好”对象。您创建了另一个,并对其进行了初始化(内存已泄漏)。您可以通过打印

的值进行检查

不需要malloc,因为堆栈已在main中分配

#include <iostream>

struct Item {
    int nodeId;
};

struct stack {
    Item* top;
    int size;
};

void initialize(stack *s)
{
    std::cout << "initialize 1. stack at " << s << std::endl;
    s = (stack*)malloc (sizeof(stack));
    std::cout << "initialize 2. stack at " << s << std::endl;
    s->size = 0; 

}

int main() {
    stack s;
    std::cout << "main 1. stack at " << &s << std::endl; 
    initialize(&s);
    std::cout << "main 2. stack at " << &s << std::endl; 
    return 0;
}

将输出(请参阅初始化2。)

main 1. stack at 0x7ffca7c72520
initialize 1. stack at 0x7ffca7c72520
initialize 2. stack at 0x5566830b0280
main 2. stack at 0x7ffca7c72520