【问题标题】:meaning of the statement声明的意义
【发布时间】:2011-09-25 17:21:49
【问题描述】:

我多次遇到char* ch = "hello";的说法。

我知道char* ch 告诉ch 是指向char 的指针。但是将 hello 分配给 ch 是什么意思?

我无法理解这一点?请帮忙。

【问题讨论】:

    标签: c pointers char c-strings


    【解决方案1】:

    这意味着ch 是一个指向字符的指针。当您执行char* ch = "hello" 时,ch 将指向第一个字符,即字符h。要指向第二个字符,您可以使用ch + 1ch[1]。请注意,理想情况下,ch 的类型应该是 const char*,因为您无法写入指向的内存位置。

    【讨论】:

    • 请注意,这种去除 const 的特殊转换在 C++98/C++03 中已被弃用,并在 C++0x 中被移除(即,使用符合 C++0x 的编译器,不会编译)。
    • 投反对票的具体原因有哪些?答案有问题吗?
    【解决方案2】:

    字符串字面量静态存储在程序二进制文件中的某处。它们很可能被加载到内存中的只读“数据”部分,但这是未定义的行为。

    分配字符串文字只是传递第一个字节的地址;在这种情况下,char* ch 指向“hello”中的“h”。

    注意:修改静态字符串是未定义的行为!虽然您可以获得指针,但任何分配都是危险的。

    【讨论】:

    • ...所以,应该是 const char * ch
    【解决方案3】:

    这里发生了几件事。

    "hello" 等于 { 'h', 'e', 'l', 'l', 'o', '\0' }。即,它是一个字符数组。数组可以隐式转换为相应的指针类型。所以这里的语句确实创建了一个(静态)字符数组,并将指向第一个元素的指针分配给变量ch(顺便说一句,命名不好)。

    【讨论】:

      【解决方案4】:

      语句编译为:

      080483b4 <main>:
       80483b4:   55                      push   %ebp
       80483b5:   89 e5                   mov    %esp,%ebp
       80483b7:   83 ec 10                sub    $0x10,%esp
       80483ba:   c7 45 fc 94 84 04 08    movl   $0x8048494,-0x4(%ebp)
       80483c1:   c9                      leave  
       80483c2:   c3                      ret
      

      0x8048494 处的字符串是“hello\0”,如 xxd 所示:

      0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b  ....hello......;
      

      【讨论】:

        猜你喜欢
        • 2015-02-15
        • 1970-01-01
        • 2012-09-23
        • 2016-12-09
        • 2014-02-23
        • 2018-05-13
        • 1970-01-01
        • 2011-01-06
        • 2017-12-24
        相关资源
        最近更新 更多