返回本地指针

Fli*_*per 2 c pointers

我的问题是对此的扩展:返回指向本地结构的指针

我编写了以下代码来创建一个空列表:

struct node* create_empty_list(void)
{
    struct node *head = NULL;
    return head;
}
Run Code Online (Sandbox Code Playgroud)

我刚刚读到返回指向局部变量的指针是没用的,因为当函数退出时,变量将被销毁.我相信上面的代码返回一个NULL指针,所以我不认为它是一个指向局部变量的指针.
在这种情况下,分配给指针的内存在哪里.我没有在堆上分配任何内存,它应该在堆栈上,作为自动变量.但是当代码退出(指针)时会发生什么,如果我尝试在程序中使用它,通过为指针分配一些pointees/de-referencing等等?

oua*_*uah 5

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)


bar*_*nos 5

在这里,您将返回局部变量的值,这是正常的:

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变量).
  • 使用单词指针时,暗示变量的值本身就是某个其他变量的地址.尽管如此,指针仍然有自己的地址(与其值无关).

请注意,上面的描述不适用于阵列.