我的问题是对此的扩展:返回指向本地结构的指针
我编写了以下代码来创建一个空列表:
struct node* create_empty_list(void)
{
struct node *head = NULL;
return head;
}
Run Code Online (Sandbox Code Playgroud)
我刚刚读到返回指向局部变量的指针是没用的,因为当函数退出时,变量将被销毁.我相信上面的代码返回一个NULL指针,所以我不认为它是一个指向局部变量的指针.
在这种情况下,分配给指针的内存在哪里.我没有在堆上分配任何内存,它应该在堆栈上,作为自动变量.但是当代码退出(指针)时会发生什么,如果我尝试在程序中使用它,通过为指针分配一些pointees/de-referencing等等?
struct node* create_empty_list(void)
{
struct node *head = NULL;
return head;
}
Run Code Online (Sandbox Code Playgroud)
相当于:
struct node* create_empty_list(void)
{
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
这很好.
如果你有类似的东西会发生这样的问题:
struct node head;
return &head; // BAD, returning a pointer to an automatic object
Run Code Online (Sandbox Code Playgroud)
在这里,您将返回局部变量的值,这是正常的:
struct node* create_empty_list()
{
struct node* head = NULL;
return head;
}
Run Code Online (Sandbox Code Playgroud)
head恰好是NULL(0)的值在函数create_empty_list返回之前被复制到堆栈中.调用函数通常会将此值复制到其他变量中.
例如:
void some_func()
{
struct node* some_var = create_empty_list();
...
}
Run Code Online (Sandbox Code Playgroud)
在下面的每个示例中,您将返回局部变量的地址,这不是正常的:
struct node* create_empty_list()
{
struct node head = ...;
return &head;
}
struct node** create_empty_list()
{
struct node* head = ...;
return &head;
}
Run Code Online (Sandbox Code Playgroud)
返回head每次create_empty_list调用函数时可能是不同地址的地址(取决于该点处的堆栈状态).该地址通常是4字节值或8字节值(取决于系统的地址空间),在函数返回之前被复制到堆栈中.您可以"以任何您喜欢的方式"使用此值,但您不应该依赖于它表示有效变量的内存地址这一事实.
关于变量的一些基本事实,对您来说很重要:
const变量).请注意,上面的描述不适用于阵列.