gpt4 book ai didi

c - 什么时候将内存分配给C中的局部变量

转载 作者:太空狗 更新时间:2023-10-29 17:20:41 27 4
gpt4 key购买 nike

因为局部变量也称为自动变量,应该在运行时,在访问函数时分配内存。

int main(){
int a; // declaration
return 0;
}

int main(){
int a[]; // compilation error, array_size missing
return 0;
}

int main(){
int a[2]; // declaration, but can't work without array_size,
// so at compile time it is checked!
return 0;
}

我的问题是,在 C 的声明中给出 array_size 是否只是一个规则,或者内存是在编译时为数组分配的(仍然是局部变量)

它是如何工作的?

根据 K&R 的 C 编程,数组是一个变量。第 161 页。

最佳答案

当您声明局部变量时,它的大小在编译时已知,但内存分配发生在执行时。

因此在您的示例中,没有大小的数组显然对编译器来说是一个问题,因为它不知道要包含到汇编代码中的大小是多少。

如果您不知道数组的大小,您始终可以使用指针类型和malloc/free 甚至alloca。前两个操作在堆上,alloca实际使用的是栈。

值得注意的异常(exception)是静态变量。它们的存储空间已在编译/链接时分配,无法在运行时更改。

例子:

int main(int argc, const char *argv[])
{
int a; // a is a sizeof(int) allocated on stack
}

int main(int argc, const char *argv[])
{
int a[2]; // a is a sizeof(int)*2 allocated on stack
}

int main(int argc, const char *argv[])
{
int *a; // a is a sizeof(int*) allocated on stack (pointer)
a = alloca(sizeof(int)*4); // a points to an area with size of 4 integers
// data is allocated on stack
}

int main(int argc, const char *argv[])
{
static int a; // a is allocated in data segment, keeps the value
}

关于c - 什么时候将内存分配给C中的局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15385411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com