3

我正在使用这个 countof 宏

COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

这给了我一个字符数组的大小,比如

char *ta[]={"asdf","qwer","zxcv"}

但是当我在函数范围内使用它时它不起作用。

int indexof(char *aword, char *arrayofwords[]){
  int i; unsigned int ct=COUNT_OF(  (*???)  arrayofwords);
  for (i=0 ; i<ct ;i++){
    if (strcmp(aword,arrayofwords[i])==0){return i;}}
  return -1;//not found
}
4

2 回答 2

3

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
}
于 2013-03-15T06:28:25.777 回答
0

@majidaldosari:我想问题出在你的宏 COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x]) ))))

应该是

COUNT_OF(x) ((sizeof(x)/sizeof(x[0])) / ((size_t)(!(sizeof(x) % sizeof(x[0])))))

于 2013-03-15T06:30:05.760 回答