【发布时间】:2014-08-12 20:54:11
【问题描述】:
我正在阅读和学习 C。我已经阅读了许多类似的问题,但其中大多数似乎是我正在经历的反例,或者我仍然不了解堆上对象分配的概念堆栈。
假设我有一个类似于以下示例的结构:
typedef struct {
int x;
char* word;
struct list_element* next;
}list_element;
我想编写一个函数来初始化list_element 类型的struct。
我将从教科书中学到的东西是使用malloc 在堆上创建结构,这样在初始化函数之外仍然可以看到所有内容。
list_element* init_list_element(int x, char* word) {
list_element* le = (list_element*)malloc(sizeof(list_element));
le->word = word;
le->x = x;
return le;
}
为了真正理解这个主题,我尝试编写一个替代初始化函数,在堆栈上分配struct。稍后尝试访问属性时应该会导致错误,因为变量应该已经超出范围。
list_element init_list_element(int x, char* word) {
list_element le;
le.word = word;
le.x = x;
return le;
}
但是,当使用第二个实现创建结构并尝试访问例如属性 x 时,代码不会中断。为什么是这样?变量le 不应该超出范围并因此在尝试打印其属性时无法访问吗?
list_element test = init_list_element(123,"test");
printf("%s, %i", test.word, test.x);
【问题讨论】: