找到指向chars数组的指针的索引

时间:2013-03-15 06:23:05

标签: c pointers

我正在使用这个数量的宏

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
}

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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])))))< /强>