注册

Linux报 “bad address” 异常的原因以及解决办法

当 Linux 程序尝试访问不属于其虚拟地址空间的内存区域时,就会出现“bad address”错误。这种情况常常由以下几种情况引起:

  1. 对空指针进行解引用操作。在如下的示例中,p 指针被初始化为空指针,因此在执行 *p 操作时会抛出“bad address”错误。

c
int *p = NULL;
*p = 100; // 触发 bad address 错误

  1. 使用 malloc、calloc、realloc 函数分配的内存块后,如果使用 free 函数释放内存后,仍然对该内存块进行访问,则会触发“bad address”错误。如下面的示例:

c
int *p = (int *)malloc(sizeof(int) * 100);
free(p);
p[0] = 100; // 触发 bad address 错误

  1. 当程序访问的内存空间越界时,就会发生“bad address”错误。如下面的示例,数组 a 只有 10 个元素,当访问超出此范围时就会触发错误。

c
int a[10];
a[20] = 100; // 触发 bad address 错误

解决办法就是要避免以上三种情况。具体来说,可以遵循以下几点:

  1. 在使用指针之前,一定要进行初始化。即使对于指针类型的局部变量也要初始化为 NULL。

c
int *p = NULL;

  1. 在使用 malloc、calloc、realloc 函数分配内存后,使用 free 函数释放内存前,一定要确保不再使用该内存块。

c
int *p = (int *)malloc(sizeof(int) * 100);
// 使用 p 指向的内存块
free(p);
p = NULL; // 置空指针

  1. 对于数组等容器类型,要确保访问的索引值不超出其范围。

c
int a[10];
// 保证访问元素不超出 a 数组的大小
a[9] = 100;

总之,避免“bad address”错误的方法就是加强对程序中各个内存指针和数组元素访问指针的检查,确保它们在使用前都已经被完全初始化和确定了其指向的内存区域。