静态字符数组的含义?

时间:2014-01-30 17:12:44

标签: c arrays string pointers static

在某处我读了以下几行: -

char *p  = "string literal";   

如果我尝试为p[i]分配新值,我的程序会崩溃。

  

答: - 它变成一个未命名的static array of characters,这个未命名的数组可能存储在只读存储器中,因此不一定能被修改。在表达式上下文中,像往常一样将数组一次转换为指针(参见第6节),因此声明将p初始化为指向未命名数组的第一个元素。

我知道static做了什么,但我不理解以上几行中的以下内容

static array of characters

3 个答案:

答案 0 :(得分:2)

这不是指静态关键字,而是指无法更改的静态关键字。

编辑:思考得更好,似乎这句话写得很糟糕,我认为当时的作者(对于那些想知道,这来自于C faq)意味着“不变”

EDIT2:OP询问什么是string literal,这是答案:

String literal是一个在源代码中硬编码的字符串(后来在编译后的程序中),你可以使用双引号"来做这个例子就是"some string literal here"

当你将它指定给一个指针时,指针指向字符串文字,它存储在程序运行代码中,而不是存储在主内存中,这就是它无法修改的原因。

您可以将字符串文字分配给数组,初始化数组,意义不同,数组将被发送到内存,并将该字符串作为其初始值。

请注意,string literal必须在双引号"内,如果您尝试其他黑客,则根本不会编译。你不能这样做:char* someVar = {'f', 'o', 'o', '\0'};它根本不起作用。 (我的编译器给出错误:excess elements in scalar initializer

答案 1 :(得分:1)

“静态”是指将为字符串文字创建的对象的storage duration

引用C99 6.4.5

  

然后使用多字节字符序列初始化一个静态存储持续时间和长度的数组,该数组足以包含该序列。

答案 2 :(得分:1)

简单字符串文字引用字符串常量关于哪个C11标准说:

  

如果这些数组的元素具有不同的数据,则未指定   适当的价值观如果程序试图修改这样的数组,则行为是   未定义即可。

在程序执行期间无法更改。虽然字符串变量可以在程序执行期间改变。字符串变量是字符数组,其最后一个元素是NUL字符(\0) 所有字符串(变量)都是字符数组,但所有字符数组都不是字符串。

当编译器遇到字符串文字时,它会将其存储在内存的只读部分,即ROM中。此处,static一词指的是unmodifiable而不是关键字static

字符串文字:

char *string_literal = "string literal";  

或者这也可以被视为

char *string_literal = {'s','t','r','i','n','g',' ','l','i','t','e','r','a','l','\0'};

字符串变量

char string_var[] = "string variable";

或者它也可以被视为

char string_var[] = {'s','t','r','i','n','g',' ','v','a','r','i','a','b','l','e', '\0'};

字符数组:

char character_array[] = {'c','h','a','r','a','c','t','e','r',' ', 'a', 'r', 'r', 'a', 'y'};