|
发表于 2021-1-21 00:29:35
|
显示全部楼层
本帖最后由 jackz007 于 2021-1-21 00:54 编辑
试试这个代码就可以找到答案了
- #include <stdio.h>
- #include <string.h>
- int main(void)
- {
- char A[] = "aaaaaaaaaaaa" ;
- char B[] = "bbbbbbb" ;
- char C[] = "ccccccc" ;
- char D[] = "ddddddd" ;
- printf("A = %s\n" , A) ;
- printf("B = %s\n" , B) ;
- printf("C = %s\n" , C) ;
- printf("D = %s\n" , D) ;
- strcpy(C , A) ;
- printf("after copy\n") ;
- printf("A = %s\n" , A) ;
- printf("B = %s\n" , B) ;
- printf("C = %s\n" , C) ;
- printf("D = %s\n" , D) ;
- }
复制代码
编译运行实况
- D:\00.Excise\C>g++ -o x x.c
- D:\00.Excise\C>x
- A = aaaaaaaaaaaa
- B = bbbbbbbb <--- 注意这里
- C = cccccccc
- D = dddddddd
- after copy
- A = aaaaaaaaaaaa
- B = aaa <--- 注意这里
- C = aaaaaaaaaaaa
- D = dddddddd
- D:\00.Excise\C>
复制代码
为了说明问题,我把代码稍微改了一下。
A 的长度是 12 个字符,加上字符串结束标志字符 '\0' 一共占用了内存 13 个字节,B、C、D 长度都是 8 个字符,各占用 9 个字节内存,现在,把字符串 A 复制到 C 中,通过显示 C 我们可以看到,复制确实是成功的,可是,C 明明只有 8 个字符空间,却容纳了整整12个字符,这是怎么做到的?究竟是怎么回事?答案是字符串复制时,越界侵占了相邻变量的内存空间。这一点,从显示出的字符串 B 中就可以找到答案。在字符串 C 能 "正常" 被显示的同时,字符串 B 已经从原来的 8 个字符 'b' ,令人惊讶地变成了 3 个字符 'a', 仔细想一下,C 可以容纳从 A 复制过来字符串中的前 9 个字符,多出来的后 3 个字符显然是侵占了属于字符串 B 的内存空间,侵占了多少呢?答案是 3 个 'a' 外加 1 个 '\0',一共 4 个字节,这就是真相,这也是 B 显示 3 个字符 'a' 的真实原因。
在本例中,被侵占内存空间的变量是字符串,对程序运行逻辑的影响不是太大,如果是其他类型的变量,有可能对程序运行逻辑产生致命的影响,所以,任何时候都不能越界使用任何变量! |
|