返回长度C和C++的CHAR*List[]的疑惑
如果我用下面的方式写它,我将结果返回为1。不明白为什么?预期答案是5返回长度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
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好几个月了,但我还是第一个认识到这个参考。作为奖励,如果我能找到三个有价值的答案,你可以随机得到三个答案的答案:-什么,你赤手空拳?砰!我猜我们都在展示我们的年龄,嗯?我只是查了一下,这是一个非常古老的游戏。