マクロを使用して配列が空かどうかを確認する必要があります。配列のサイズが2などの定数の場合、次のようなマクロを書くことができます
#define IS_EMPTY(arr) \
((arr[0] | arr[1]) == 0)
しかし、 arr がこのように定義されている場合
#define ARRAY_SIZE 100
int arr[ARRAY_SIZE];
マクロが配列が空であることを判断できる方法はありますか? または、インライン関数が唯一のオプションです。
最も実行可能なオプションはループです。
int IsEmpty(char * array, size) {
int i;
for (i=0; i<size; i++)
if (array[i] != 0)
return 0;
return 1;
}
または memcmp:
int IsEmpty(char * array, size) {
char * emptyArray = malloc(size);
memset(emptyArray, 0, size);
int res = memcmp(array, emptyArray, size);
free(emptyArray);
return res==0;
}
配列の定義が見られる場合。つまり、struct foo arr[]={initialization_list} の場合、array_length = sizeof(array) / sizeof(element_of_array);
それを回避する他の方法は、グローバル変数が(多くの)パディングなしで割り当てられることを前提としたポインター演算である可能性があります。
extern int a[]={2,4,5}; extern int b=1;
サイズ = (&b-&a[0])/sizeof(int);