用 C 编码时的一个常见情况是编写返回指针的函数。如果在运行时编写的函数中发生错误,NULL
可能会返回以指示错误。NULL
只是特殊的内存地址 0x0,它从不用于任何事情,只是表示特殊情况的发生。
我的问题是,是否有任何其他特殊的内存地址永远不会用于用户级应用程序数据?
我想知道这一点的原因是因为它可以有效地用于错误处理。考虑一下:
#include <stdlib.h>
#include <stdio.h>
#define ERROR_NULL 0x0
#define ERROR_ZERO 0x1
int *example(int *a) {
if (*a < 0)
return ERROR_NULL;
if (*a == 0)
return (void *) ERROR_ZERO;
return a;
}
int main(int argc, char **argv) {
if (argc != 2) return -1;
int *result;
int a = atoi(argv[1]);
switch ((int) (result = example(&a))) {
case ERROR_NULL:
printf("Below zero!\n");
break;
case ERROR_ZERO:
printf("Is zero!\n");
break;
default:
printf("Is %d!\n", *result);
break;
}
return 0;
}
知道一些用户级应用程序永远不会使用的特殊地址范围可以有效地用于更有效和更清洁的条件处理。如果您知道这一点,它适用于哪些平台?
我猜跨度将是操作系统特定的。我对 Linux 最感兴趣,但也很高兴了解 OS X、Windows、Android 和其他系统。