char[]
的尺寸为number of char times sizeof(char)
,
char*
的大小为sizeof(pointer)
- 指向第一个元素的指针。
sizeof(char[])
在声明它的number of char times sizeof(char)
中打印main()
,但是如果我将此数组传递给函数,它的函数会将char[]
转换为char*
并且它是使用sizeof()
,
"void pr(char chr[])" is changed to "void pr(char chr*)"
代码示例:
using namespace std;
void pr(char chr[])
{
std::cout << "in pr(): " << sizeof(chr)<<"\n";
}
int main()
{
char* c;
char z[] = { 1,2,3,4,5,6,7,8,9};
c = z;
std::cout << "sizeof char* c in main(): " << sizeof(c) << "\n";
std::cout << "sizeof char* c "; pr(c); std::cout << "\n";
std::cout << "sizeof char z[] in main(): " << sizeof(z) << "\n";
std::cout << "sizeof char z[] "; pr(z); std::cout << "\n";
getchar();
return 0;
}
输出:
sizeof char* c in main(): 4 // pointer size
sizeof char* c in pr(): 4 // pointer size
sizeof char z[] in main(): 9 // elements*sizeof(char)
sizeof char z[] in pr(): 4 // pointer s
此行为是标准化还是基于其实施?
答案 0 :(得分:5)
这是标准行为,因为涉及函数调用,[dcl.fct]/5
说:
每个参数的类型(包括 函数参数包)由其自己的decl-specifier-seq和声明符确定。确定后 每个参数的类型,“T的数组”或函数类型T的任何参数都被调整为 “指向T的指针”。
因此您要打印char*
的大小。
改为使用引用:
void pr(char (&chr)[9])
{
std::cout << "in pr(): " << sizeof(chr)<<"\n";
}
会在第二种情况下再次输出9
。
如果您对阵列的大小感兴趣,请提供其他建议:
std::array
或其他容器(首选和首先阅读文档,以避免浪费堆栈空间等陷阱)答案 1 :(得分:1)
在两种情况下(char []和char *)都将数组作为指针传递。在函数内部,无法获得有关数组的已分配内存的额外信息。您可以使用关于大小的额外参数或您自己的struct或类的typedef,也可以使用STD库。