【问题标题】:Where in memory the const function parameters are stored in C? [duplicate]const 函数参数存储在 C 中的内存位置? [复制]
【发布时间】:2017-08-27 04:26:39
【问题描述】:

const 函数参数在 C 中存储在内存的什么位置?

一般参数存储在堆栈中,但如果参数声明为const,那么它存储在哪里?

【问题讨论】:

标签: c


【解决方案1】:

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 关键字。

【讨论】:

    【解决方案2】:

    与任何其他参数相同(取决于实现)。 const 限定符仅表示该函数不会修改其参数。这并不意味着参数是可以消除的编译时常量表达式。

    此外,编译器并不一定要在调用堆栈上传递参数/参数(如果实现存在这样的事情)。如果编译器认为更好,它们也可以在寄存器中传递。

    【讨论】:

    • 静态参数怎么样?
    • @user3865070 - 参数不能是静态的,所以这是一个没有实际意义的问题
    • 我要问的原因是为什么不允许使用 static 以及为什么允许使用 const ?
    • @user3865070 - 因为static 是变量的存储持续时间限定符,所以它控制它们的生命周期(参数不能在程序的持续时间内存在,它存在于单个函数调用中)。 const 将变量限定为程序不可修改,并且与变量的生命周期完全正交。
    • @StoryTeller: 是的,但公平地说,我看不出任何明显的原因为什么不允许参数具有持久存储持续时间,语义上等同于在函数入口处将参数分配到静态副本并引用到那个对象的位置。我不确定,但我相信 Fortran 允许通过SAVE 实现这一点,并且在极少数情况下它可能会有点用处,比如类似于register 风格的优化器提示,以保留递归函数中的堆栈空间。虽然坦率地说,这样的功能可能主要是错误的来源。
    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 2013-04-24
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多