int* x = malloc(10 * sizeof(int)); x[10] = 0; // problem 1: heap block overrun } // problem 2: memory leak -- x not freed int main(void)
时间: 2024-09-24 07:29:08 浏览: 51
这段代码展示了两个常见的内存管理问题:
1. **堆块溢出(Heap Block Overrun)**: `x[10] = 0;` 这行试图访问数组 `x` 的第11个元素,但是 `malloc` 分配的内存只包含10个整数的空间。数组索引从0开始,所以当你尝试访问 `x[10]` 时,实际上超出了分配给 `x` 的有效范围,可能会导致未定义的行为,比如覆盖其他数据,甚至引发程序崩溃。
2. **内存泄漏(Memory Leak)**: 在 `main` 函数结束后,`x` 没有被释放。由于使用了 `malloc` 分配内存,程序员需要通过 `free(x)` 来手动回收这块内存,否则这部分动态分配的内存将不会返回到系统,造成内存泄漏,长期累积可能导致可用内存不足的问题。
正确的做法应该是确保在不再需要 `x` 时,使用 `free(x)` 或者将其赋值为 `NULL` 并在合适的地方释放它。修复后的例子可能像这样:
```c
int* x = malloc(10 * sizeof(int));
if (x != NULL) {
// 使用 x
x[9] = 0; // 修改为合法范围内
// ...其他操作...
// 使用完毕后释放内存
free(x);
x = NULL;
}
int main(void) {
// ...程序主体...
}
```
阅读全文