我有以下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)编译
答案 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。这意味着一切都会发生。该程序可能会崩溃,它可能会产生奇怪的结果,或者它似乎可以正常工作。这一切都取决于该指针中的任何随机值。
无法保证调用未定义的行为会导致崩溃。