char *p = "string literal";
如果我尝试为p[i]
分配新值,我的程序会崩溃。
答: - 它变成一个未命名的
static array of characters
,这个未命名的数组可能存储在只读存储器中,因此不一定能被修改。在表达式上下文中,像往常一样将数组一次转换为指针(参见第6节),因此声明将p初始化为指向未命名数组的第一个元素。
我知道static
做了什么,但我不理解以上几行中的以下内容
static array of characters
。
答案 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)
答案 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'};