【发布时间】:2011-09-25 17:21:49
【问题描述】:
我多次遇到char* ch = "hello";的说法。
我知道char* ch 告诉ch 是指向char 的指针。但是将 hello 分配给 ch 是什么意思?
我无法理解这一点?请帮忙。
【问题讨论】:
我多次遇到char* ch = "hello";的说法。
我知道char* ch 告诉ch 是指向char 的指针。但是将 hello 分配给 ch 是什么意思?
我无法理解这一点?请帮忙。
【问题讨论】:
这意味着ch 是一个指向字符的指针。当您执行char* ch = "hello" 时,ch 将指向第一个字符,即字符h。要指向第二个字符,您可以使用ch + 1 或ch[1]。请注意,理想情况下,ch 的类型应该是 const char*,因为您无法写入指向的内存位置。
【讨论】:
字符串字面量静态存储在程序二进制文件中的某处。它们很可能被加载到内存中的只读“数据”部分,但这是未定义的行为。
分配字符串文字只是传递第一个字节的地址;在这种情况下,char* ch 指向“hello”中的“h”。
注意:修改静态字符串是未定义的行为!虽然您可以获得指针,但任何分配都是危险的。
【讨论】:
这里发生了几件事。
"hello" 等于 { 'h', 'e', 'l', 'l', 'o', '\0' }。即,它是一个字符数组。数组可以隐式转换为相应的指针类型。所以这里的语句确实创建了一个(静态)字符数组,并将指向第一个元素的指针分配给变量ch(顺便说一句,命名不好)。
【讨论】:
语句编译为:
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......;
【讨论】: