我有:
void func()
{
char *s;
strcpy(s,"bla bla");
}
“bla bla”存放在某个地方吗?它是否被认为是“const char *”,即使我没有定义它?
答案 0 :(得分:2)
字符串文字是无名数组对象,它们存储在静态内存中,即存储全局变量的相同内存。字符串文字永远存在:它们在程序开始时存在,并且一直持续到程序结束(就像全局变量一样)。
但请注意,在您的代码示例中,"blah blah"
是字符串文字。但是你的s
只是一个从字符串文字初始化(通过复制数据)的局部变量。您的s
与其他任何局部变量具有相同的生命周期 - 只要控件通过func
,它就会存在。
另请注意,C中的字符串文字不被视为const chart *
,因为您似乎错误地相信。 C语言中"blah blah"
的类型实际上是char [10]
。数组类型可以衰减为指针类型,但即使在这种情况下它也是char *
而不是const char *
。
答案 1 :(得分:-2)
"blah blah"
存储在堆栈中,就像在函数内声明的任何其他自动变量或数组一样。
施工
char s[] = "blah blah";
相当于
char s[] = {'b', 'l', 'a', 'h', ' ', 'b', 'l', 'a', 'h', '\0'};
并初始化数组。
您可以将字符数组视为char * const
,因为它们的行为几乎与数组相同,但从技术上讲,数组是数组,指针是指针。
但这与const char *
不同。 char * const
表示无法修改指针,const char *
表示无法通过该指针修改内存。