我是否以定义的方式使用局部变量?

时间:2014-03-06 17:58:25

标签: c

我不确定我创建局部变量的方式是否是未定义的行为。

N和L都持有指向临时堆栈地址的指针。这样安全吗?编译器会忘记我正在使用指向堆栈地址的指针并用其他东西覆盖它,比如其他局部变量吗?我知道一旦函数的范围结束就不安全了。但我不确定下面的例子。任何见解都将非常感激。感谢您的时间。

struct Node { /* ... */ };

struct Node*
Node_setNode(struct Node* node)
{
    /* ... */
    return node;
}

struct List { /* ... */ };

void
List_push(struct List* list, struct Node* node)
{
    /* ... */
    list->next = node;
}


int main()
{

    struct Node* N = Node_setNode((& ((struct Node){ 0 })));
    struct List L;
    List_push(&L, (& ((struct Node){ 0 })));

    return 0;
}

2 个答案:

答案 0 :(得分:3)

堆栈的重点在于你可以把它推到最上面。

当你调用另一个函数时,你用一个局部变量推送一个新的堆栈帧,而不会影响main()下面的堆栈帧。

函数中声明的变量将保留在其堆栈中,直到它返回。

答案 1 :(得分:2)

不,编译器不会忘记您的局部变量。你使用它们的方式既安全又好。

请确保你永远不会返回指向堆栈上某些东西的指针,你应该没问题。