我不确定我创建局部变量的方式是否是未定义的行为。
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;
}
最佳答案
堆栈的全部意义在于您可以将东西压在它上面。
当您调用另一个函数时,您会压入一个新的堆栈帧及其局部变量,而不会影响 main()
的下层堆栈帧。
在函数中声明的变量将保留在其堆栈中,直到它返回。
关于c - 我是否以定义的方式使用局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22232334/