我不确定我创建局部变量的方式是否是未定义的行为。
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;
}
答案 0 :(得分:3)
堆栈的重点在于你可以把它推到最上面。
当你调用另一个函数时,你用一个局部变量推送一个新的堆栈帧,而不会影响main()
下面的堆栈帧。
函数中声明的变量将保留在其堆栈中,直到它返回。
答案 1 :(得分:2)
不,编译器不会忘记您的局部变量。你使用它们的方式既安全又好。
请确保你永远不会返回指向堆栈上某些东西的指针,你应该没问题。