是的,局部变量的寿命范围(内{
,}
),其中它被创建。
局部变量具有自动或局部存储。自动,因为一旦创建范围结束,它们就会自动销毁。
但是,您这里拥有的是字符串文字,它在实现定义的只读内存中分配。字符串文字与局部变量不同,它们在程序生命周期中始终有效。它们具有静态持续时间 [Ref 1]寿命。
请注意!
但是,请注意,任何试图修改字符串文字内容的尝试都是未定义的行为(UB)。用户程序不允许修改字符串文字的内容。
因此,总是鼓励使用const
一阵子声明字符串文字。
const char*p = "string";
代替,
char*p = "string";
实际上,在C ++中,不建议在C语言中声明一个字符串文字,而在C语言中const
却没有。但是,使用a声明字符串文字const
会给您带来的好处是,如果您尝试在其中修改字符串文字,编译器通常会给您一个警告。第二种情况。
示例程序:
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source);
strcpy(str2,source);
return 0;
}
输出:
cc1:警告被视为错误
prog.c:在函数'main'中:
prog.c:9:错误:传递'strcpy'的参数1会从指针目标类型中丢弃限定符
请注意,编译器会针对第二种情况发出警告,但不会针对第一种情况发出警告。
要在此处回答几个用户提出的问题:
整数与整数有什么关系?
换句话说,以下代码有效吗?
int *foo()
{
return &(2);
}
答案是,没有此代码无效。格式不正确,会导致编译器错误。
就像是:
prog.c:3: error: lvalue required as unary ‘&’ operand
字符串文字是l值,即:您可以使用字符串文字的地址,但不能更改其内容。
然而,任何其它文本(int
,float
,char
等)的r值(C标准使用术语的表达式的值对这些)和它们的地址不能在所有服用。
[Ref 1] C99标准6.4.5 / 5“字符串文字-语义”:
在转换阶段7中,将一个或多个字符串文字产生的每个多字节字符序列附加一个零值的字节或代码。然后,将多字节字符序列用于初始化一个足以包含该序列的静态存储持续时间和长度数组。对于字符串文字,数组元素的类型为char,并使用多字节字符序列的各个字节进行初始化。对于宽字符串文字,数组元素的类型为wchar_t,并使用宽字符序列进行初始化...
如果它们的元素具有适当的值,则不确定这些数组是否不同。如果程序尝试修改此类数组,则行为未定义。
int rc
。它的生存期在return
-s的每一个结束。您要返回的指针是字符串文字。字符串文字具有静态存储期限:它们的生存期至少与程序的生存期一样长。