gpt4 book ai didi

c - 段错误不会发生

转载 作者:行者123 更新时间:2023-11-30 18:21:34 25 4
gpt4 key购买 nike

我有以下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 处,并且在我的树莓派上发生更大的随机 i 值) 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
}

静态变量自动初始化

{
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
}

关于c - 段错误不会发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41243889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com