Asi*_*ics 1 c memory compiler-construction string string-literals
当您将字符串替代品传递给参数中的函数而不是指向字符数组的指针时,编译器如何管理内存?
例子:
static const char myString[LENGTH] = "A string";
myFunction(myString);
Run Code Online (Sandbox Code Playgroud)
和:
myFunction("A string");
Run Code Online (Sandbox Code Playgroud)
通过指针传递静态常量(很可能存储在 ROM 中)是否会对 RAM 使用产生显着的好处?
当传递字符串文字时,它是否完全复制为局部变量,sizeof(myString)
或者编译器“知道”通过引用传递它,因为在 C 中数组总是通过引用传递?
该标准没有规定如何使用字符串文字,也没有规定不同部分中使用的相同字符串文字是否会共享。它只是说它们具有静态存储持续时间,修改它们是未定义的行为。否则,字符串文字只是一个字符数组,并具有相应的行为。
6.4.5
C99 标准草案字符串文字部分对此进行了介绍:
在翻译阶段 7,值为零的字节或代码被附加到由一个或多个字符串文字产生的每个多字节字符序列。66) 然后,使用多字节字符序列来初始化静态存储持续时间和长度刚好足以包含序列。对于字符串文字,数组元素的类型为 char,
和:
如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序尝试修改这样的数组,则行为是未定义的。
在分配给它的情况下,myString
它将被复制到为此分配的内存,这在初始化myString
部分中有介绍,其中说:6.7.8
字符类型的数组可以由字符串文字初始化,可选地用大括号括起来。字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。