以下代码段当然不是一个好主意:
char *vram = (char*)0xB8000;
memset(vram, 32, 0x18000);
这也不是:
volatile char *LCDC = (volatile char*)0xFF40;
char LCDCshadow = *LCDC;
并且以下显然是未定义的行为:
int *dontdoit = 0;
*dontdoit;
因为在指针上下文中使用0时,它将成为空指针的值,并且取消引用空指针是未定义的行为。
但是前两个示例是“未定义行为”,还是只是实现已定义/未指定?
如果是后者,则如何生成一个值为0的有效指针?
转换为指针时,值为0的整数常量表达式将生成NULL指针,而与NULL指针的实际表示方式无关。
C标准的6.3.2.3p3节规定:
值为0的整数常量表达式或转换为type的表达式
void *
称为空指针常量。如果将空指针常量转换为指针类型,则保证生成的指针(称为空指针)将不相等的值与指向任何对象或函数的指针进行比较。
实现定义是将任何其他整数值转换为指针值。从第6.3.2.3p5节开始:
整数可以转换为任何指针类型。除非先前指定,否则结果是实现定义的,可能未正确对齐,可能未指向引用类型的实体,并且可能是陷阱表示。
以上内容通常适用于访问特定内存地址的嵌入式实现。
如果您有一个支持非零NULL指针的实现,则可以通过一个变量为它分配值0,例如:
int zero = 0;
int *zeroptr = (int *)zero;
在这种情况下,指针的值将为0,但不会为NULL。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句