gpt4 book ai didi

c - C中字符串文字的"Life-time"

转载 作者:IT老高 更新时间:2023-10-28 12:31:26 25 4
gpt4 key购买 nike

难道后面函数返回的指针是不可访问的吗?

char *foo(int rc)
{
switch (rc)
{
case 1:

return("one");

case 2:

return("two");

default:

return("whatever");
}
}

所以 C/C++ 中局部变量的生命周期实际上只在函数内,对吗?这意味着,在 char* foo(int) 终止之后,它返回的指针不再意味着什么,对吧?

我对局部变量的生命周期有点困惑。什么是好的说明?

最佳答案

是的,局部变量的生命周期在创建它的范围内({,})。

局部变量具有自动或本地存储。 自动,因为一旦创建它们的范围结束,它们就会自动销毁。

但是,您在这里拥有的是一个字符串文字,它分配在实现定义的只读内存中。字符串文字与局部变量不同,它们在整个程序生命周期中保持事件状态。它们具有静态持续时间 [Ref 1] 生命周期。

请注意!

但是,请注意,任何修改字符串文字内容的尝试都是 undefined behavior (UB)。不允许用户程序修改字符串文字的内容。
因此,始终鼓励在声明字符串文字时使用 const

const char*p = "string"; 

而不是,

char*p = "string";    

事实上,在 C++ 中,不推荐使用不带 const 的字符串文字,尽管在 C 中没有。但是,使用 const 声明字符串文字会给您带来优点是编译器通常会在您尝试在第二种情况下修改字符串文字时向您发出警告。

Sample program :

#include<string.h> 
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";

strcpy(str1,source); // No warning or error just Undefined Behavior
strcpy(str2,source); // Compiler issues a warning

return 0;
}

输出:

cc1: warnings being treated as errors
prog.c: In function ‘main’:
prog.c:9: error: passing argument 1 of ‘strcpy’ discards qualifiers from pointer target type

请注意编译器会警告第二种情况,但不会警告第一种情况。


在这里回答几个用户提出的问题:

整数字面量是怎么回事?

也就是说,下面的代码有效吗?

int *foo()
{
return &(2);
}

答案是,不,此代码无效。它格式不正确,会导致编译器错误。

类似:

prog.c:3: error: lvalue required as unary ‘&’ operand

字符串文字是左值,即:您可以获取字符串文字的地址,但不能更改其内容。
但是,任何其他文字(intfloatchar 等)都是 r 值(C 标准使用术语 这些的表达式的值)和它们的地址根本不能被取走。


[引用 1]C99 标准 6.4.5/5“字符串文字 - 语义”:

In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence; for wide string literals, the array elements have type wchar_t, and are initialized with the sequence of wide characters...

It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

关于c - C中字符串文字的"Life-time",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470959/

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