C 函数参数的内存位置

C 函数参数的内存位置,c,memory,argument-passing,C,Memory,Argument Passing,我正在准备UNIX考试,有一个关于C变量的内存位置的问题。 假设我们有这样的代码 char sth; int some_function(int arg) { int some_int; // some code here } 所以我假设sth位于堆上,堆栈上的一些int,但是arg位于哪里? 有人能解释一下C变量是如何管理的吗 谢谢请注意,这一切都取决于实现。C标准甚至没有说出stack、heap等词。它只是讨论了根据变量的存储情况而期望变量的行为(static,extern,r

我正在准备UNIX考试,有一个关于C变量的内存位置的问题。 假设我们有这样的代码

char sth;
int some_function(int arg) {
   int some_int;
   // some code here
}
所以我假设
sth
位于堆上,
堆栈上的一些int
,但是
arg
位于哪里? 有人能解释一下C变量是如何管理的吗


谢谢

请注意,这一切都取决于实现。C标准甚至没有说出stack、heap等词。它只是讨论了根据变量的存储情况而期望变量的行为(
static
extern
register
等)

话虽如此,通常
arg
将位于为函数提供的堆栈框架中。它的作用域仅限于函数,就像
some\u int
的作用域一样


顺便说一下,
sth
不在堆上,它有一个静态全局存储

请注意,这一切都取决于实现。C标准甚至没有说出stack、heap等词。它只是讨论了根据变量的存储情况而期望变量的行为(
static
extern
register
等)

话虽如此,通常
arg
将位于为函数提供的堆栈框架中。它的作用域仅限于函数,就像
some\u int
的作用域一样


顺便说一下,
sth
不在堆上,它有一个静态全局存储

这里的一切都是完全依赖于平台的,实际上不是关于C语言,而是关于我的编译器是如何做到这一点的


sth
具有静态(全局)存储,因此它可能不在堆上,而是在全局数据段中
some int
确实在
some函数的本地堆栈框架中。变量
arg
some_function
中填充,但它的位置取决于编译器和通常所称的“调用约定”:它可以在调用者或被调用者的堆栈框架中进行分配和清理,也可以由调用者或被调用者根据约定进行分配和清理,或者传入一个寄存器而根本不进入内存。

这里的所有内容都完全依赖于平台,实际上与C语言无关,而是关于我的编译器是如何做到这一点的


sth
具有静态(全局)存储,因此它可能不在堆上,而是在全局数据段中
some int
确实在
some函数的本地堆栈框架中。变量
arg
some_function
中填充,但它的位置取决于编译器和通常所称的“调用约定”:它可以在调用者或被调用者的堆栈框架中进行分配和清理,也可以由调用者或被调用者根据约定进行分配和清理,或者在寄存器中传递,而根本不进入内存。

arg将位于堆栈中(至少对于桌面平台)


阅读一篇名为“为了乐趣和利润粉碎堆栈”的文档,您将了解如何在C中管理内存。

arg将位于堆栈中(至少对于桌面平台)


阅读一篇名为“粉碎堆栈以获取乐趣和利润”的文档,您将了解如何在C中管理内存。

sth
在静态内存中,
arg
一些int
在堆栈中<调用
某个函数时,code>arg
被复制(“推”)到堆栈中。堆是动态内存,包含在运行时分配的数据(例如使用
malloc

sth
在静态内存中,
arg
一些int
在堆栈中<调用
某个函数时,code>arg
被复制(“推”)到堆栈中。堆是动态内存,包含在运行时分配的数据(例如使用
malloc

参数(很少有例外)在堆栈上传递

您应该能够验证它们是否在您的计算机体系结构中,只需执行以下操作

printf("%p - %p\n", &arg, &some_int);
它们之间的距离通常应在几个字节以内

编辑:正如其他人所指出的,sth不是在堆上分配的,而是在程序的数据段中分配的,即编译器已经在编译时分配了内存。

参数(很少有例外)在堆栈上传递

您应该能够验证它们是否在您的计算机体系结构中,只需执行以下操作

printf("%p - %p\n", &arg, &some_int);
它们之间的距离通常应在几个字节以内

编辑:正如其他人所指出的,sth不是在堆上分配的,而是在程序的数据段中分配的,即编译器已经在编译时分配了内存。

sth可能位于(也称为“BSS”,取决于平台):

同样,这完全取决于“平台”,但通常有四个区域“段”,您可以从中分配可变空间:

a) Heap:语言的运行时管理“Heap”数据,例如通过调用“malloc()”或“new”)

b) 堆栈:这些是“自动”变量

c) BSS:未初始化(可变)静态数据

d) 数据:初始化(通常为只读)静态数据

某事物可能位于(又称“BSS”,取决于平台):

同样,这完全取决于“平台”,但通常有四个区域“段”,您可以从中分配可变空间:

a) Heap:语言的运行时管理“Heap”数据,例如通过调用“malloc()”或“new”)

b) 堆栈:这些是“自动”变量

c) BSS:未初始化(可变)静态数据

d) 数据:初始化(通常为只读)静态数据


这取决于实施情况;参数可以被推送到堆栈框架上,也可以被写入寄存器,或者被其他机制传递

语言定义不要求存储各种对象的位置