【问题标题】:meaning of static array of characters?静态字符数组的含义?
【发布时间】:2014-01-30 17:12:43
【问题描述】:

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

char *p  = "string literal";   

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

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

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

static array of characters.

【问题讨论】:

  • 链接到 OP:“某处”c-faq.com/decl/strlitinit.html
  • Kelvin 在这里阅读了前两点 static
  • @GrijeshChauhan : 也许我也很困惑,因为我以为作者指的是static,但他指的是英文static
  • @kevingomes 是的作者在该特定行中引用了静态的英文含义。
  • @GrijeshChauhan :我也对文字感到困惑。请告诉我字面量的含义以及它与 char 数组有何不同

标签: c arrays string pointers static


【解决方案1】:

这里指的不是static关键字,而是静态的意思,不能改变。

编辑:想得更好,这句话似乎写得不好,我认为当时的作者(对于那些想知道的人,这来自C faq)的意思是“恒定”

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

字符串文字是在您的源代码中(以及稍后在您编译的程序中)硬编码的字符串,您可以使用双引号" 来实现它,例如"some string literal here"

当你把 this 赋值给一个指针时,指针指向的是字符串文字,它存储在你的程序运行代码中,而不是在主内存中,这就是它不能被修改的原因。

你可以给数组赋值一个字符串字面量,来初始化数组,意义不同,数组会被送到内存的哪里,并且会以那个字符串作为它的初始值。

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

【讨论】:

  • 是的,这句话一定有误。据我所知static 意味着一个变量的值在不同的函数调用之间是有效的。
  • 是的,你是对的。措辞在英语中是正确的,但是如果您猜到上面的单词是关键字(它们不是),则会令人困惑。这段非常具有历史意义的文本的作者在编写时应该更加小心。
  • 我也对文字感到困惑。请告诉我字面量的含义以及它与 char 数组有何不同。
  • Literal 在 C 中意味着它是一个介于 "" ( "this is a literal" ) 之间的字符串,与非文字字符串 {'t', 'h', 'i', 's ','','i','s','','n','o','t','','a','','l','i','t', 'e', 'r', 'a', 'l', '\0'}
  • 您的意思是说"hello" 是字符串文字,而{'h','e','l','l','o','\0'} 不是
【解决方案2】:

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

引用C99 6.4.5

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

【讨论】:

    【解决方案3】:

    简单的字符串字面量指的是字符串常量,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'};     
    

    【讨论】:

    • 很明显,“静态”是指存储时长。在您(其他人)的解释中,这句话可以改写为:“它变成了一个未命名的、不可修改的字符数组,并且这个未命名的数组可能存储在只读内存中,因此不一定可以修改。”或更短的“你不能修改它,你可能不能修改它!”。
    • 我没有投反对票,但我认为char arraysstring literals 也以\0 终止。
    • @kevingomes;是的,字符串文字也以\0 结尾,但并非所有字符数组都以\0 结尾。
    • @rmartinjak;好吧,这里static 肯定不是关键字。
    • @hacks : 请举个例子
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    相关资源
    最近更新 更多