c 语言指针问题

2018-02-28 14:38:53 +08:00
 thomaswang
int main ( ){
    char * name = "123";
    name += 1;
    fprintf(stderr, "%c\n", *name);
    fprintf(stderr, "%c\n", name);

    return 0;
}

执行结果是: 2 R 多次编译,执行结果不变

这两种打印,都是什么值

1285 次点击
所在节点    问与答
6 条回复
hx1997
2018-02-28 15:41:22 +08:00
2: name 里存的第二个字符
R: name 里存的第二个字符所在内存地址的低字节(或者高?我忘了)所对应的 ASCII 字符
hx1997
2018-02-28 15:47:21 +08:00
低还是高可能取决于小端序还是大端序?
sbw
2018-02-28 15:47:34 +08:00
第二句不变的原因是字符串存储在二进制的相同位置了,在前后增加其它内容,或者改变一下优化选项,name 所代表的字符串存储的相对位置就会改变,第二句的输出就会变化
lance6716276
2018-02-28 16:25:57 +08:00
2:123 的 2
R:一个地址的按照%c 表示
icedx
2018-02-28 17:00:50 +08:00
看汇编应该更好理解

装入*name

mov eax, [esp+1Ch]
movzx eax, byte ptr [eax]
movsx eax, al
mov [esp+4], eax

装入 name

mov eax, [esp+1Ch]
mov [esp+4], eax
thomaswang
2018-02-28 17:57:15 +08:00
@icedx 厉害了,我的哥

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/433497

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX