本文共 4880 字,大约阅读时间需要 16 分钟。
当《绝对能够测试你的C语言功力的几个问题》第一次出现在CSDN首页时,我就进入了张老师Blog。客观上说,出的题目比较基础,但每一题都说出一个所以然来,恐怕不是很简单。过了几天就贴出了《语言测试题的讲解分析》,我怀着好奇的心情进去看了看。发现里面赞扬的也有,诋毁的也有。韩愈《师说》里面讲过:闻道有先后,术业有专攻。张老师自然有他的可取之处,也有不知道的知识点。 int x=35; char str[10]; strcpy(str,"www.it315.org"/* 共 13 个字母 */); // 问 : 此时 x 和 strlen(str) 的值分别是多少? |
…… | 78 | 56 | 34 | 12 | …… |
…… | 12 | 34 | 56 | 78 | …… |
1 #include <stdio.h> 2 #include <string.h> 3 4 int main() 5 { 6 int x = 35; 7 char str[10]; 8 strcpy(str,"www.it315.org"/*共13个字母*/); 9 printf("%d/n",x); 10 return 0; 11 } |
1: #include <stdio.h> 2: #include <string.h> 3: 4: int main() 5: { 00401010 push ebp 00401011 mov ebp,esp 00401013 sub esp,50h 00401016 push ebx
00401017 push esi 00401018 push edi 00401019 lea edi,[ebp-50h] 0040101C mov ecx,14h 00401021 mov eax,0CCCCCCCCh 00401026 rep stos dword ptr [edi] 6: int x = 35; 00401028 mov dword ptr [ebp-4],23h /*将35压进栈中*/ (1处) 7: char str[10]; 8: strcpy(str,"www.it315.org"/*共13个字母*/); 0040102F push offset string "www.it315.org" (00420020) 00401034 lea eax,[ebp-10h] (2处) 00401037 push eax 00401038 call strcpy (00401100) 0040103D add esp,8 9: printf("%d/n",x); 00401040 mov ecx,dword ptr [ebp-4] (3处) 00401043 push ecx 00401044 push offset string "%d/n" (0042001c) 00401049 call printf (00401080) 0040104E add esp,8 10: return 0; 00401051 xor eax,eax 11: } |
栈帧布局 高地址
低地址 |
图 4字符串在栈中的布局
.file "sttest.c" .section .rodata .align 32 .LC0: .string "www.it315.org" .string "" .LC1: .string "%d/n" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $56, %esp andl $-16, %esp movl $0, %eax subl %eax, %esp movl $35, -12(%ebp) /*将35放到栈中,即x处*/ (1处)
movl $.LC0, 4(%esp) leal -40(%ebp), %eax (2处) movl %eax, (%esp) call strcpy movl -12 (%ebp), %eax (3处) movl %eax, 4(%esp) movl $.LC1, (%esp) call printf movl $0, %eax leave ret .size main, .-main .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.3.5 (Debian 1:3.3.5-13)" |