2024年2月20日发(作者:)

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);

return 0;

}

```

5. 结构体成员越界访问:```c

struct Point {

int x;

int y;

};

struct Point p;

p.x = 10;

p.y = 20;

p.z = 30; // 越界访问,结构体没有```

6. 动态内存越界访问:

```c

z成员

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语言程序时,我们应该避免这些错误,确保程序正常运行和内存安全。可以通过良好的编程习惯、合理的内存分配和管理、使用边界检查等方式来避免内存越界问题的发生。