Segfault不会发生

时间:2016-12-20 13:49:00

标签: c memory segmentation-fault

我有以下c代码:

#include <stdint.h>
#include <stdio.h>

int main (){
    uint8_t *array;
    int i=0;
    for(;i<32120;i++)
        printf("Array[%d] = %d \n",i,*(array+i));
}

因为我没有为数组声明内存,所以我希望这个代码在第二次迭代时会出现段错误,但事实并非如此(它发生在我的覆盆子上的i == 3295,并且我的值更大的随机值debian虚拟机。

我在这里遗漏了什么吗?

ps:使用gcc版本4.9.2(Debian 4.9.2-10)编译

2 个答案:

答案 0 :(得分:5)

当您尝试访问非分页内存块时,会发生分段错误。它是一个访问非初始化指针的未定义行为,也是未初始化的下标访问内存是未定义的^ 2。

未定义的行为可能导致分段错误,可能导致数据丢失,可能导致papa noel从您的终端出来!或....但在大多数情况下,与内存相关的未定义行为问题会导致分段错误或类似问题,但为什么在取消引用您提到的索引之前,您还没有获得分段错误?

这是因为你没有初始化指针数组,存储在存储器中的数值被占用的数据没有改变。完全靠你的机会,这个变量包含一个在应用程序虚拟内存空间上分页的地址。如果将其初始化为零或使其静态或将其定义为全局变量,则肯定会在其第一次取消引用时出现分段错误。

一些例子:

手动初始化为NULL(零)

{
   int * ptr = NULL;
   int index;
   *ptr = 1;    // segfault
   *ptr[index] = 1; // may not segfault, based on uninitialized value stored in index
}

静态变量自动初始化

{
    static int * ptr; // static variable (default initialized to 0)
    *ptr = 1;   // segfault
}

全局变量自动初始化,

int * ptr; // global variable (default initialized to 0)
{
    *ptr = 1;  // segfault
}

堆栈中的本地存储变量未初始化,并保持内存占用的值不受影响

{
    int * ptr; // unintialized
    *ptr = 1;  // may segfault or may not 
}

答案 1 :(得分:1)

取消引用未初始化的指针会调用undefined behavior。这意味着一切都会发生。该程序可能会崩溃,它可能会产生奇怪的结果,或者它似乎可以正常工作。这一切都取决于该指针中的任何随机值。

无法保证调用未定义的行为会导致崩溃。