gpt4 book ai didi

c - 传递给函数调用的字符串文字存储在 c 中的什么位置

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:55 24 4
gpt4 key购买 nike

我知道程序中使用的字符串文字会存储在只读区域中,例如。

//global
const char *s="Hello World \n";

此处字符串文字“Hello World\n”在程序的只读区域中存储。现在假设我在一些函数的主体中声明了一些文字,比如

func1(char *name)
{
const char *s="Hello World\n";
}

由于函数的局部变量存储在该函数的激活记录中,这是字符串文字也一样吗?再次假设我从某个函数 func2 调用 func1 作为

func2()
{
//code
char *s="Mary\n";

//call1
func1(s);

//call2
func1("Charles");

//code
}

在上面,在第一次从 func2 调用 func1 时,传递了“s”的起始地址,即 s[0] 的地址,而在第二次调用中我不确定实际发生了什么。字符串文字“Charles”在哪里获取存储空间。是否有一些温度是由编译器创建的,它的地址是否被传递或发生了其他事情?我发现文字在“只读数据”部分从 String literals: Where do they go?但我不清楚这是否只发生在全局文字上,还是发生在某些函数的局部文字上。任何见解都将是可观的。谢谢。

最佳答案

一个C字符串字面量表示一个类型为char[len+1]的数组对象,其中len是长度,加上1作为结束符'\0 '。此数组对象具有静态存储持续时间,这意味着它在程序的整个执行过程中都存在。无论字符串文字出现在何处,这都适用。

文字本身是一个表达式类型char[len+1]。 (在大多数但不是所有的上下文中,它将被隐式转换为指向第一个字符的 char* 值。)

编译器可能会对此进行优化,例如,只存储一次相同的字符串文字,或者如果它们从未被引用则根本不存储它们。

如果你这样写:

const char *s="Hello World\n";

在一个函数中,字面意思就是我上面描述的。指针对象s被初始化为指向数组对象的第一个字符。

由于历史原因,字符串文字在 C 中不是 const,但试图修改相应的数组对象具有未定义的行为。声明指针 const(如您在此处所做的那样)不是必需的,但这是一个绝妙的主意。

关于c - 传递给函数调用的字符串文字存储在 c 中的什么位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19667562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com