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)
当您尝试访问非分页内存块时,会发生分段错误.它是一个访问非初始化指针的未定义行为,也是未初始化的下标访问内存未定义^ 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)
| 归档时间: |
|
| 查看次数: |
117 次 |
| 最近记录: |