c语言 内存越界的例子
内存越界是指程序在访问数组、指针或其他内存区域时,超出了其所分配的范围,访问了不属于该内存区域的内容。这种错误可能导致程序崩溃、数据损坏、安全漏洞等问题。下面列举了10个C语言中常见的内存越界的例子。
1. 数组越界访问:
```c
int arr[5];
arr[5] = 10; // 越界访问,应该访问arr[0]到arr[4]
```
2. 指针越界访问:
```c
int *p = malloc(sizeof(int) * 5);
p[5] = 10; // 越界访问,应该访问p[0]到p[4]
```
3. 字符串越界访问:
```c
char str[10] = "hello";
str[10] = '!';
```
4. 函数参数越界访问:
```c
void foo(int arr[5]) {
arr[5] = 10; // 越界访问,应该访问arr[0]到arr[4]
}
int main() {
int arr[5];
foo(arr);
sizeof 指针 return 0;
}
```
5. 结构体成员越界访问:
```c
struct Point {
int x;
int y;
};
struct Point p;
p.x = 10;
p.y = 20;
p.z = 30; // 越界访问,结构体没有z成员
```
6. 动态内存越界访问:
```c
int *p = malloc(sizeof(int) * 5);
p[5] = 10; // 越界访问,应该访问p[0]到p[4]
```
7. 使用已释放的内存:
```c
int *p = malloc(sizeof(int) * 5);
free(p);
p[0] = 10; // 使用已释放的内存,可能导致程序崩溃或数据损坏
```
8. 缓冲区溢出:
```c
char buffer[10];
scanf("%s", buffer); // 如果输入的字符串长度超过10,会导致缓冲区溢出
```
9. 堆栈溢出:
```c
void foo() {
foo(); // 递归调用自身,没有终止条件,会导致堆栈溢出
}
int main() {
foo();
return 0;
}
```
10. 访问已释放的指针:
```c
int *p = malloc(sizeof(int));
free(p);
*p = 10; // 访问已释放的指针,可能导致程序崩溃或数据损坏
```
以上是10个常见的内存越界的例子。在编写C语言程序时,我们应该避免这些错误,确保程序正常运行和内存安全。可以通过良好的编程习惯、合理的内存分配和管理、使用边界检查等方式来避免内存越界问题的发生。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论