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、およびその他のシステムについても知っておくとよいでしょう。