为什么这个 C 代码会抛出分段错误?



我有以下c代码

void *curr = (unsigned long *)some_fixed_address;
if (!curr) {*(unsigned long *)curr = a^b;}

其中some_fixed_address存储长整数0ab是一些预定义的整数。当我运行此代码时,出现错误

Program received signal SIGSEGV, Segmentation fault.

有什么理由会这样吗?

更新:

下面是最小的可验证示例:

#include <stdio.h>
int main()
{
size_t start = 0;
size_t a = 5;
size_t b = 100;
void *curr = (char *)start;
if (!curr) {*(unsigned long *)curr = a^b;}
printf("%d", *(int *)curr);
return 0;
}

在您的机器上,NULL可能按位等于0(尽管标准不要求这样做)。

因此,当您将some_fixed_address转换为指针时,最终会得到一个充满0的指针,这是NULL指针。

然后!curr检查curr是否NULL。然后,您尝试取消引用if语句正文中的curr,这会导致 SEGFAULT。

您向我们展示的唯一合乎逻辑的解释是some_fixed_address为零,这是不可寻址的,因此存在段错误。

否则,您的if (!curr) { ... }无法执行 -它仅在0curr时执行。

我想知道你是否把if语句的逻辑倒过来了。 (或者您没有提供足够的信息,并且您的错误位于其他地方。

好吧,这段代码毫无意义

void *curr = (unsigned long *)some_fixed_address;
if (!curr) {*(unsigned long *)curr = a^b;} <<< only if curr is null then try to do something with it

我想你的意思是

void *curr = (unsigned long *)some_fixed_address;
if (curr) {*(unsigned long *)curr = a^b;} <<<< if curr is not null then try to do something

但是,您在该行上收到错误的事实强烈表明some_fixed_address为 0。因此,上面的"更正"代码将运行,但不会执行任何操作。

相关内容

  • 没有找到相关文章

最新更新