【发布时间】:2017-08-27 04:26:39
【问题描述】:
const 函数参数在 C 中存储在内存的什么位置?
一般参数存储在堆栈中,但如果参数声明为const,那么它存储在哪里?
【问题讨论】:
标签: c
const 函数参数在 C 中存储在内存的什么位置?
一般参数存储在堆栈中,但如果参数声明为const,那么它存储在哪里?
【问题讨论】:
标签: c
const关键字表示带有该关键字的数据将无法修改内容。
例如,如果函数有带 const 的参数:
void my_func(const char c) {
//Do things
//This is prohibited and will cause error:
c = 3;
}
//Function call
char a = 'a'; //This is stored on RAM somewhere (if inside function, then it is on stack)
my_func(a); //Call function, value of a is pushed to stack.
这个函数不能改变c里面的值。
如果你有带 const 参数的全局变量,那么一些编译器会将它放入 FLASH 内存(非易失性)内存中。这主要发生在嵌入式系统上,但不确定是否真的会发生。
//This is stored either on RAM or on non-volatile memory (FLASH)
const char str[] = "My string which cannot be modified later";
int main(void) {
//...your code
//This is prohibited:
str[2] = 3; //Error!
}
此str 是常量,无法修改。现在,现代编译器(ARM 编译器)会将其放入闪存中,在 AVR 上,这可能会发生。在那里你必须为 AVR 添加 GCC 的 PROGMEM 关键字。
【讨论】:
与任何其他参数相同(取决于实现)。 const 限定符仅表示该函数不会修改其参数。这并不意味着参数是可以消除的编译时常量表达式。
此外,编译器并不一定要在调用堆栈上传递参数/参数(如果实现存在这样的事情)。如果编译器认为更好,它们也可以在寄存器中传递。
【讨论】:
static 是变量的存储持续时间限定符,所以它控制它们的生命周期(参数不能在程序的持续时间内存在,它存在于单个函数调用中)。 const 将变量限定为程序不可修改,并且与变量的生命周期完全正交。
SAVE 实现这一点,并且在极少数情况下它可能会有点用处,比如类似于register 风格的优化器提示,以保留递归函数中的堆栈空间。虽然坦率地说,这样的功能可能主要是错误的来源。