我已经进行了一些搜索,但似乎找不到确切的答案。似乎应该可以,但不能。这是我的代码:
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);
答案 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