1

如果我这样写,我返回结果为1。不明白为什么?预期答案是 5。

    int main()
    {
      const char* list_of_filename[] = {"One","Two","Three","Four","Five"};

      printf("%d", countFiles(list_of_filename));

      return 0;
    }

    int countFiles(const char* list_of_filename[])
    {
      return sizeof(list_of_filename) / sizeof(list_of_filename[0]);
    }
4

4 回答 4

4

sizeof对于数组仅适用于声明数组的范围。

  const char* list_of_filename[] = {"One","Two","Three","Four","Five"};
  printf("%d", sizeof(list_of_filenames) / sizeof(list_of_filenames[0]));

在 C 中,您不能传递数组。所以:

int countFiles(const char* list_of_filename[])

与以下内容完全相同:

int countFiles(const char **list_of_filename)

因此,您正在比较两个指针的大小。const char *和的大小const char **在您的系统上是相同的。

这个答案(由 Michael Burr 提供,但最初来自 Chromium)提供了一个执行数组大小计算的宏,以及像这样的一些无效结构的错误(但不是这个)

于 2012-04-05T03:45:17.483 回答
2

作为函数参数,

const char* list_of_filename[]

实际上意味着:

const char** list_of_filename.

因此,您实际上计算的是:

sizeof(char**) / sizeof(char*)

char**andchar*都只是指针,并且由于所有指针通常具有相同的大小(至少在这种情况下,对您而言,这两个是):

x / x
= 1


编辑:将数组传递给 C 中的函数时,您通常要么想要传递数组的大小,要么用特定值终止数组,以便能够确定它的长度。

于 2012-04-05T03:47:43.253 回答
1

来自 C 标准 ( C11 6.3.2.1 Lvalues, arrays, and function designators, para 3):

除非它是 sizeof 运算符、_Alignof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为 ''array of type'' 的表达式将转换为具有type ''pointer to type'' 指向数组对象的初始元素并且不是左值。

换句话说,当您将该数组传递给函数时,它变成了指向数组第一个元素的指针,因此它的大小就是指针的大小。

如果要将其视为函数中的数组,则需要显式传递大小信息,例如:

void printArray (int *arr, size_t sz) {
    for (size_t i = 0; i < sz; i++)
        print ("%d ", arr[i]);
    puts ("");
}
:
int xyzzy[] = {3,1,3,1,5,9,2,6,5,3,5,8,9};
printArray (xyzzy, sizeof (xyzzy) / sizeof (*xyzzy));
于 2012-04-05T03:52:44.710 回答
0

C数组和指针不一样!

新手 C 程序员经常听到的第一件事是“数组与指针相同”。不幸的是,这是一个危险的半真半假。ANSI C 标准第 6.5.4.2 段建议您

注意声明之间的区别:

extern int *x;
extern int y[];

第一个声明 x 是一个指向 int 的指针;第二个声明 y 是一个未指定大小的 int 数组(一个不完整的类型),其存储在别处定义。

该标准没有比这更详细地讨论这个问题。

因此,当您尝试sizeof从数组中获取时,它以字节为单位返回整个数组的大小(对象大小的总和),当您尝试获取sizeof指针时 - 它以字节为单位返回指针的大小。指针的大小在一个平台上始终是恒定值。一般为 4 或 8 个字节。

记住这一点 :)

于 2012-04-05T04:47:50.380 回答