|
发表于 2004-10-20 09:15:44
|
显示全部楼层
这个程序:
- #include <stdio.h>
- static int var1;
- static char var2;
- static int var3;
- int main(void)
- {
- char str_val1[]="24\n";
- char str_val2[]="32\n";
- char str_val3[]="48\n";
- sscanf(str_val1,"%d",&var1);
- sscanf(str_val2,"%d",&var2);
- sscanf(str_val3,"%d",&var3);
- printf("var1=%d,var2=%d,var3=%d\n",var1,var2,var3);
- return 0;
- }
复制代码
是看不到预期效果的。你定义的变量是静态变量,静态变量在运行时是放在.data段的,不是放在栈上的。我看了程序编译后的可执行文件的段头表(执行objdump -h),结果如下:
- [kj501@s2023 c]$ objdump -h a.out
- a.out: file format elf32-i386
- Sections:
- Idx Name Size VMA LMA File off Algn
- 0 .interp 00000013 08048114 08048114 00000114 2**0
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 1 .note.ABI-tag 00000020 08048128 08048128 00000128 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 2 .hash 0000002c 08048148 08048148 00000148 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 3 .dynsym 00000060 08048174 08048174 00000174 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 4 .dynstr 00000053 080481d4 080481d4 000001d4 2**0
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 5 .gnu.version 0000000c 08048228 08048228 00000228 2**1
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 6 .gnu.version_r 00000020 08048234 08048234 00000234 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 7 .rel.dyn 00000008 08048254 08048254 00000254 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 8 .rel.plt 00000018 0804825c 0804825c 0000025c 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 9 .init 00000017 08048274 08048274 00000274 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 10 .plt 00000040 0804828c 0804828c 0000028c 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 11 .text 00000234 080482d0 080482d0 000002d0 2**4
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 12 .fini 0000001a 08048504 08048504 00000504 2**2
- CONTENTS, ALLOC, LOAD, READONLY, CODE
- 13 .rodata 00000030 08048520 08048520 00000520 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 14 .eh_frame 00000004 08048550 08048550 00000550 2**2
- CONTENTS, ALLOC, LOAD, READONLY, DATA
- 15 .data 0000000c 08049554 08049554 00000554 2**2
- CONTENTS, ALLOC, LOAD, DATA
- 16 .dynamic 000000c8 08049560 08049560 00000560 2**2
- CONTENTS, ALLOC, LOAD, DATA
- 17 .ctors 00000008 08049628 08049628 00000628 2**2
- CONTENTS, ALLOC, LOAD, DATA
- 18 .dtors 00000008 08049630 08049630 00000630 2**2
- CONTENTS, ALLOC, LOAD, DATA
- 19 .jcr 00000004 08049638 08049638 00000638 2**2
- CONTENTS, ALLOC, LOAD, DATA
- 20 .got 0000001c 0804963c 0804963c 0000063c 2**2
- CONTENTS, ALLOC, LOAD, DATA
- 21 .bss 00000010 08049658 08049658 00000658 2**2
- ALLOC
- 22 .comment 00000132 00000000 00000000 00000658 2**0
- CONTENTS, READONLY
- 23 .debug_aranges 00000078 00000000 00000000 00000790 2**3
- CONTENTS, READONLY, DEBUGGING
- 24 .debug_pubnames 00000025 00000000 00000000 00000808 2**0
- CONTENTS, READONLY, DEBUGGING
- 25 .debug_info 00000a0e 00000000 00000000 0000082d 2**0
- CONTENTS, READONLY, DEBUGGING
- 26 .debug_abbrev 00000138 00000000 00000000 0000123b 2**0
- CONTENTS, READONLY, DEBUGGING
- 27 .debug_line 00000258 00000000 00000000 00001373 2**0
- CONTENTS, READONLY, DEBUGGING
- 28 .debug_str 000006a3 00000000 00000000 000015cb 2**0
- CONTENTS, READONLY, DEBUGGING
- [kj501@s2023 c]$
复制代码
可见.data段是按照2的2次方也就是4字节对齐的。除非你填入8个字节的长整数,你才能看到数据被覆盖的效果。 |
|