C 堆栈上分配的作用域结构

C 堆栈上分配的作用域结构,c,struct,scope,C,Struct,Scope,我正在阅读和学习C语言。我读过许多类似的问题,但其中大多数似乎是我所经历的一个反例,或者我仍然不理解堆和堆栈上对象分配的概念 假设我有一个类似以下示例的结构: typedef struct { int x; char* word; struct list_element* next; }list_element; 我想写一个函数来初始化list\u元素类型的struct。 我从课本中学到的是使用malloc在堆上创建结构,这样在initialiser函数之外的所有内容都

我正在阅读和学习C语言。我读过许多类似的问题,但其中大多数似乎是我所经历的一个反例,或者我仍然不理解堆和堆栈上对象分配的概念

假设我有一个类似以下示例的结构:

typedef struct {
    int x;
    char* word;
    struct list_element* next;
}list_element;
我想写一个函数来初始化
list\u元素类型的
struct
。 我从课本中学到的是使用
malloc
在堆上创建结构,这样在initialiser函数之外的所有内容都仍然可见

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;
}
为了真正理解这个主题,我尝试编写一个可选的初始化器函数,在堆栈上分配
结构。这将导致稍后在尝试访问属性时出错,因为变量应已超出范围

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);
您正在创建在第二个函数中创建的结构的副本,因此您仍然可以访问它,但它只是一个副本

在C语言中,分配给变量的所有内容都是一个副本

例如:

list_element le1 = {1, NULL, NULL};
list_element le2 = le1;
le2将包含le1的副本,而不是原始le1。换句话说,以下内容不会改变le1的值:

le2.x = 3;
printf("%d",le1.x); // 1
printf("%d",le2.x); // 3
您正在创建在第二个函数中创建的结构的副本,因此您仍然可以访问它,但它只是一个副本

在C语言中,分配给变量的所有内容都是一个副本

例如:

list_element le1 = {1, NULL, NULL};
list_element le2 = le1;
le2将包含le1的副本,而不是原始le1。换句话说,以下内容不会改变le1的值:

le2.x = 3;
printf("%d",le1.x); // 1
printf("%d",le2.x); // 3
您正在创建在第二个函数中创建的结构的副本,因此您仍然可以访问它,但它只是一个副本

在C语言中,分配给变量的所有内容都是一个副本

例如:

list_element le1 = {1, NULL, NULL};
list_element le2 = le1;
le2将包含le1的副本,而不是原始le1。换句话说,以下内容不会改变le1的值:

le2.x = 3;
printf("%d",le1.x); // 1
printf("%d",le2.x); // 3
您正在创建在第二个函数中创建的结构的副本,因此您仍然可以访问它,但它只是一个副本

在C语言中,分配给变量的所有内容都是一个副本

例如:

list_element le1 = {1, NULL, NULL};
list_element le2 = le1;
le2将包含le1的副本,而不是原始le1。换句话说,以下内容不会改变le1的值:

le2.x = 3;
printf("%d",le1.x); // 1
printf("%d",le2.x); // 3

变量
le
已超出范围,但您无法访问
le
init\u list\u element()
函数返回
le
的一个副本,该副本的内容被分配给
test


test
的成员包含与
le
最初相同的数据。

变量
le
已超出范围,但您没有访问
le
init\u list\u element()
函数返回
le
的一个副本,该副本的内容被分配给
test


test
的成员包含与
le
最初相同的数据。

变量
le
已超出范围,但您没有访问
le
init\u list\u element()
函数返回
le
的一个副本,该副本的内容被分配给
test


test
的成员包含与
le
最初相同的数据。

变量
le
已超出范围,但您没有访问
le
init\u list\u element()
函数返回
le
的一个副本,该副本的内容被分配给
test


test
的成员包含的数据与
le
最初包含的数据相同。

因此,如果我原始问题中的第二个函数也会返回一个指针,并且我使用在堆栈上创建的list\u元素返回&le,则会出现错误?如果您试图返回本地的地址,它会发出警告变量因此,最好的方法是使用malloc在heap@tim_aso中保留一些空间,如果我的原始问题中的第二个函数也会返回一个指针,并且我使用在堆栈上创建的list_元素返回&le,那么会有错误吗?如果您试图返回局部变量的地址,它会发出警告。因此,最好的方法是使用malloc在heap@tim_aso中保留一些空间,如果我的原始问题中的第二个函数也会返回一个指针,并且我使用在堆栈上创建的list_元素返回&le,那么会有错误吗?如果您试图返回局部变量的地址,它会发出警告。因此,最好的方法是使用malloc在heap@tim_aso中保留一些空间,如果我的原始问题中的第二个函数也会返回一个指针,并且我使用在堆栈上创建的list_元素返回&le,那么会有错误吗?如果您试图返回局部变量的地址,它会发出警告。因此,最好的方法是使用malloc在heap@tim_a中保留一些空间