Segfault不会发生

Syf*_*lis -1 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));
}
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么吗?

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

e.j*_*dar 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
}
Run Code Online (Sandbox Code Playgroud)

静态变量自动初始化

{
    static int * ptr; // static variable (default initialized to 0)
    *ptr = 1;   // segfault
}
Run Code Online (Sandbox Code Playgroud)

全局变量也会自动初始化

int * ptr; // global variable (default initialized to 0)
{
    *ptr = 1;  // segfault
}
Run Code Online (Sandbox Code Playgroud)

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

{
    int * ptr; // unintialized
    *ptr = 1;  // may segfault or may not 
}
Run Code Online (Sandbox Code Playgroud)