写一个存在堆溢出的demo
时间: 2024-06-11 13:08:19 浏览: 14
这里提供一个简单的存在堆溢出的demo,代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *str = (char *)malloc(sizeof(char) * 10);
strcpy(str, "hello");
printf("%s\n", str);
free(str);
char *new_str = (char *)malloc(sizeof(char) * 6);
strcpy(new_str, "world");
strcat(str, new_str); // 这里存在堆溢出,因为str已经被free掉了,不能再操作它
printf("%s\n", str);
free(new_str);
return 0;
}
```
在这个demo中,我们先动态分配了一个长度为10的字符数组,并将"hello"赋值给它,然后打印出来。接着,我们又动态分配了一个长度为6的字符数组,并将"world"赋值给它。但是,在将new_str中的内容拼接到str之前,我们没有分配新的内存空间给str,而是直接使用了已经被free掉的内存空间,导致了堆溢出的问题。
解决这个问题的方法是,我们在拼接new_str之前,先为str重新分配内存空间,例如:
```
char *new_str = (char *)malloc(sizeof(char) * 6);
strcpy(new_str, "world");
str = (char *)realloc(str, sizeof(char) * (strlen(str) + strlen(new_str) + 1));
strcat(str, new_str);
```
这样就能避免堆溢出的问题了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)