sizeof
被称为编译时运算符。它只能计算可以预先确定大小的对象的大小。因此,当您将指针传递给它时(数组在作为函数参数传递时退化为指针),您只需获得指针的大小。
一个典型的安排是用 NULL 指针结束列表。使用这样的列表,您的函数可以这样编写:
int indexof(char *aword, char *arrayofwords[]){
int i;
for (i=0 ; arrayofwords[i]!=NULL ;i++){
if (strcmp(aword,arrayofwords[i])==0){return i;}}
return -1;//not found
}
这可能确实令人惊讶,因为以下确实有效:
#include <stdlib.h>
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
int main() {
char *ta[]={"asdf","qwer","zxcv"};
char *aword="qwer";
int i; unsigned int ct=COUNT_OF(ta);
for (i=0 ; i<ct ;i++){
if (strcmp(aword,ta[i])==0){return i;}}
return -1;//not found
}
这是因为该数组是在应用于它ta
的同一范围内定义的。sizeof
由于在编译时sizeof
执行计算,它可以使用编译器的符号表来准确地发现为每个部分分配了多少空间。
但是,当你将它传递给一个函数时,就编译器而言,它不再是一个数组。该indexof
函数不能sizeof
用来发现传递的数组的大小,因为在这个函数内部它不是一个数组,它只是一个指针(char ** == char *[] == char [][])。
使用COUNT_OF
宏的一种方法是indexof
接受长度参数。然后您可以COUNT_OF
在调用中使用(只要相关数组在范围内定义)。
#include <stdlib.h>
#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))
int main() {
char *ta[]={"asdf","qwer","zxcv"};
char *word="qwer";
return indexof(word, ta, COUNT_OF(ta));
}
int indexof(char *aword, char *arrayofwords[], int length){
int i; unsigned int ct=length;
for (i=0 ; i<ct ;i++){
if (strcmp(aword,arrayofwords[i])==0){return i;}}
return -1;//not found
}