我知道解引用空指针是未定义的 - 但我想知道在特定目标 - MSP430上会发生什么。
我现在没有开发板可以测试这个问题。
如果我这样做(或类似),会发生什么?
int * foo = NULL;
(*foo)++; //Crash?
地址0x0位于SFR范围内,是保留的。
它会生成PUC/POR吗?还是默默地“工作”?
生成的汇编代码为
;int * foo = NULL;
clr.w R15
;(*foo)++;
inc.w R15
因此,地址0x0实际上被递增1。
当我在模拟器中运行时,我看到地址0x0处的值从0变为1。我在调试日志中没有收到任何警告,并且程序正常退出。
我正在使用IAR EW430编译器/汇编器/模拟器。
00000000h
,给定int *ptr = NULL; int deref = *ptr;
,编译器也不需要生成尝试解引用地址零的代码。它可以简单地将其替换为运行时陷阱指令,例如——即使在目标处理器上解引用地址零不会触发陷阱。 - Keith Thompson