【发布时间】:2016-01-08 02:59:35
【问题描述】:
编译器如何知道是否在堆或堆栈上分配了某些东西,例如,如果我在函数中创建变量并返回变量的地址,编译器会警告我“函数返回局部变量的地址” :
#include <stdio.h>
int* something() {
int z = 21;
return &z;
}
int main() {
int *d = something();
return 0;
}
我理解为什么这是一个警告,因为当函数退出时,堆栈帧不再存在,如果您有一个指向该内存的指针并且您更改它的值,您将导致分段错误。我想知道的是编译器如何知道该变量是否通过分配内存。 malloc,或者它如何判断它是否是堆栈上的局部变量?
【问题讨论】:
-
因为它放在那里。它知道哪些是局部变量。这就是它的用途,除此之外。
标签: c compiler-theory