比较一下char *s="hi,db"; s[0]='H';和char s[10]="hi,db"s[0]='H'这两个代码片段的区别
使用指针时报错:void main(){ char *s="hi,db"; s[0]='H';}反汇编结果:080483b4: 80483b4: 55 push %ebp 80483b5: 89 e5 mov %esp,%ebp 80483b7: 83 ec 10 sub $0x10,%esp//char *s="hi,db" 80483ba: c7 45 fc a0 84 04 08 movl $0x80484a0,-0x4(%ebp)//s[0]="H",可以看到当我们试图将0x48(ascii码就是'H')写入一个地址为80484a0的内存中时,就会出错//因为这个内存快是存放常量字符串"hi,db",而常量字符串是放在.rodata段中的,也就是只读内存,所以不能将'H'写道//只读内存中 80483c1: 8b 45 fc mov -0x4(%ebp),%eax 80483c4: c6 00 48 movb $0x48,(%eax)//函数返回 80483c7: c9 leave 80483c8: c3 ret
使用数组却没有报错:void main(){ char s[10]="hi,db"; s[0]='H';}反汇编结果:080483b4: 80483b4: 55 push %ebp 80483b5: 89 e5 mov %esp,%ebp 80483b7: 83 ec 10 sub $0x10,%esp//char s[10]="hi,db" 80483ba: c7 45 f6 68 69 2c 64 movl $0x642c6968,-0xa(%ebp) 80483c1: c7 45 fa 62 00 00 00 movl $0x62,-0x6(%ebp) 80483c8: 66 c7 45 fe 00 00 movw $0x0,-0x2(%ebp)//s[0]="H" 将'H'写到栈中的内存没什么问题 80483ce: c6 45 f6 48 movb $0x48,-0xa(%ebp) 80483d2: c9 leave 80483d3: c3 ret