Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回长度C和C++的CHAR*List[]的疑惑_C_Visual C++ - Fatal编程技术网

返回长度C和C++的CHAR*List[]的疑惑

返回长度C和C++的CHAR*List[]的疑惑,c,visual-c++,C,Visual C++,如果我用下面的方式写它,我将结果返回为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_file

如果我用下面的方式写它,我将结果返回为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]);
    }
数组的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,它提供了一个执行数组大小计算的宏,一些无效构造上的错误(如此,但不是此构造)仅在声明数组的范围内起作用

  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,它提供了一个宏来进行数组大小计算,并在一些无效的构造上出现了错误,例如作为函数参数的这一个,而不是这一个

const char* list_of_filename[]
实际上是指:

const char** list_of_filename.
因此,您实际计算的是:

sizeof(char**) / sizeof(char*)
char**和char*都只是指针,而且由于所有指针通常都具有相同的大小(至少在本例中是如此),因此对您来说,这两个指针确实:

x / x
= 1

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

作为函数参数

const char* list_of_filename[]
实际上是指:

const char** list_of_filename.
因此,您实际计算的是:

sizeof(char**) / sizeof(char*)
char**和char*都只是指针,而且由于所有指针通常都具有相同的大小(至少在本例中是如此),因此对您来说,这两个指针确实:

x / x
= 1
编辑:将数组传递给C中的函数时,通常需要传递数组的大小或使用特定值终止数组,以便能够确定数组的长度。

来自C标准C11 6.3.2.1左值、数组和函数指示符,第3段:

除非它是sizeof运算符、_Alignof运算符或 一元运算符,或是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值

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

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

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));
根据C标准C11 6.3.2.1左值、数组和函数指示符,第3段:

除非它是sizeof运算符、_Alignof运算符或 一元运算符,或是用于初始化数组的字符串文字,一个具有 类型“”的数组“”已转换为类型为“”指向类型“”的指针的表达式 指向数组对象的初始元素,并且不是左值

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

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

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));
C数组和指针不一样

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

注意声明之间的区别:

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

标准中没有比这更详细的内容

所以,当您尝试从数组中获取sizeof时,它返回整个数组的大小(以字节为单位)和对象的大小之和;当您尝试获取指针的sizeof时,它返回指针的大小(以字节为单位)。指针的大小在一个平台上始终是常量。通常是4或8个字节

记住这一点:

C数组和指针是不同的

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

注意声明之间的区别:

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

该标准没有在任何更大的范围内讨论这一问题 尾巴比那个大

所以,当您尝试从数组中获取sizeof时,它返回整个数组的大小(以字节为单位)和对象的大小之和;当您尝试获取指针的sizeof时,它返回指针的大小(以字节为单位)。指针的大小在一个平台上始终是常量。通常是4或8个字节


记住这一点:

xyzy?您正处于一个迷宫中,迷宫中有扭曲的小数组索引,所有索引都是一样的-@亚当,恭喜你,尽管我已经使用xyzzy和plugh好几个月了,但我还是第一个认识到这个参考。作为奖励,如果我能找到三个有价值的答案,你可以随机得到三个答案的答案:-什么,你赤手空拳?砰!我猜我们都在展示我们的年龄,对吧?我只是查了一下,这是一个非常古老的游戏。xyzzy?您正处于一个迷宫中,迷宫中有扭曲的小数组索引,所有索引都是一样的-@亚当,恭喜你,尽管我已经使用xyzzy和plugh好几个月了,但我还是第一个认识到这个参考。作为奖励,如果我能找到三个有价值的答案,你可以随机得到三个答案的答案:-什么,你赤手空拳?砰!我猜我们都在展示我们的年龄,嗯?我只是查了一下,这是一个非常古老的游戏。