数据离奇消失bug------栈覆盖

* 工作中遇到的bug,当时写了一块内存后,其他内存的数据消失了,百思不得其解,后来想到会不会是栈内存覆盖,一看还真是。于是就有了这篇文章。

* 在通过栈申请的内存有一个特点,他是连续的,这就很容易造成一个现象,如果出现栈溢出问题,会覆盖写掉其他变量的东西。比如我下面写的例子。

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char bigmem[50] = {0};

void main()
{
    char ip[20] = "192.168.40.1";
    char flag = 1;
    char md5[32] = "abc654377afeeeeeee231231231232"; //瞎写
    printf("ip:%p md5:%p flag:%p\n",ip,md5,&flag);
    printf("before ip:%s md5:%s flag:%d\n",ip, md5, flag);
    memcpy(ip,bigmem,sizeof(bigmem));

    printf("after ip:%s md5:%s flag:%d\n",ip, md5, flag);
}

```
* 通过运行,本来是要给ip数组写入东西,但是由于写入的数据超过了ip数组的大小,导致栈溢出,写到了后面的内存上,导致覆盖了MD5数组的内存上,引起了md5打印为空的现象。而flag变量由于地址在ip的前面,所以没有被覆写。
* 运行结果:
```
ip:0x7fffed6d2800 md5:0x7fffed6d2820 flag:0x7fffed6d27ff
before ip:192.168.40.1 md5:abc654377afeeeeeee231231231232 flag:1
after ip: md5: flag:1
```

猜你喜欢

转载自blog.csdn.net/G_Super_Mouse/article/details/112913659