在内存中,const函数参数存储在C中?

时间:2017-04-02 06:46:31

标签: c

内存中的const函数参数存储在C?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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添加PROGMEM GCC关键字。