函数中的常量字符串 - 它们保存在哪里?

时间:2013-12-14 21:26:29

标签: c

我有:

void func()
{
    char *s;
    strcpy(s,"bla bla");
}

“bla bla”存放在某个地方吗?它是否被认为是“const char *”,即使我没有定义它?

2 个答案:

答案 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 *表示无法通过该指针修改内存。