记C/C++内存地址数据覆盖问题
问题源自于一段非常简单的代码,代码如下
1 | int number = 0; |
当我们正常输入一个整型数据以及正确长度的4个字符以内的数据时(大小为5的字符串数组存储字符串需要存储一个ASCII码为0的结束符,所以只能存储4个字符),程序不会出现任何问题,如下控制台输出:

而当输入的字符串长度为5或大于5时,就会出现如下问题:


输入的Number值变化了,以下是问题分析结果:
首先可以确认的是数据越界了,str只能存储包括结束符在内的5个字符,但是我却存储了不止5个字符,在这种情况下我们却可以成功的访问str数据的所有元素,说明str数组多占用了本不属于它自己的内存空间,而整型数据Number的数值发生了改变,也可以说明str数组已经占用了整型数据Number的一部分空间。(C/C++注重运行时效率,没有做数组越界检查,所以出现数据越界问题不会出现报错)。
在上述代码的数据定义下方,加上查看整型数据以及字符数组所在的内存地址的代码:
1 | printf("Number origin memory address in: %p\n",&number); |
执行结果如下(不同操作系统分配内存方式与不同数据类型分配的大小都可能存在差异,本示例程序是基于MacOS运行的结果):

- 首先被定义的是整型数据,它的大小是4个字节,所以它的地址空间应该是88,89,90,91结尾的四个连续地址,而字符数组是后定义的,它的地址空间应该是83,84,85,86,87结尾的这5个字节。当字符串为abcdef时,整型数据为200时,f字符和空结束符会存储到本应该存储整型数据的88和89这两个字节上来,以至于导致整型数据的低8-16位变成了空结束符ASCII码值0,低八位变成了f字符ASCII码值102,这16位已经完全能够覆盖整型数据的全部内容了,导致最终Number的值变为了102