int main ( ){
char * name = "123";
name += 1;
fprintf(stderr, "%c\n", *name);
fprintf(stderr, "%c\n", name);
return 0;
}
执行结果是: 2 R 多次编译,执行结果不变
这两种打印,都是什么值
int main ( ){
char * name = "123";
name += 1;
fprintf(stderr, "%c\n", *name);
fprintf(stderr, "%c\n", name);
return 0;
}
执行结果是: 2 R 多次编译,执行结果不变
这两种打印,都是什么值
|
hx1997Feb 28, 2018 via Android
1
2: name 里存的第二个字符
R: name 里存的第二个字符所在内存地址的低字节(或者高?我忘了)所对应的 ASCII 字符 |
|
hx1997Feb 28, 2018 via Android
2
低还是高可能取决于小端序还是大端序?
|
|
sbwFeb 28, 2018
3
第二句不变的原因是字符串存储在二进制的相同位置了,在前后增加其它内容,或者改变一下优化选项,name 所代表的字符串存储的相对位置就会改变,第二句的输出就会变化
|
|
lance6716276Feb 28, 2018 via Android
4
2:123 的 2
R:一个地址的按照%c 表示 |
|
icedxFeb 28, 2018
5
看汇编应该更好理解
装入*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 |
|
6
@icedx 厉害了,我的哥
|