我有以下c
代码
void *curr = (unsigned long *)some_fixed_address;
if (!curr) {*(unsigned long *)curr = a^b;}
其中some_fixed_address
存储长整数0
,a
和b
是一些预定义的整数。当我运行此代码时,出现错误
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) { ... }
无法执行 -它仅在0
curr
时执行。
我想知道你是否把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。因此,上面的"更正"代码将运行,但不会执行任何操作。