void myfunc(char* passedArray)
{
cout << sizeof(passedArray) << endl; // prints 4
}
int main(void)
{
char charArray[] = "abcdefghiklmop";
cout << sizeof(charArray) << endl; // prints 15
myfunc(charArray);
cout << sizeof(charArray) << endl; // prints 15
}
我相信它仍然应该在该功能中打印出来......
答案 0 :(得分:9)
这是指针和数组的经典问题。正如您所看到的,问题是数组会衰减为指针。指针类型包含 no 关于它指向的数据的元数据,除了指向类型的大小。所有其他元数据(例如数组长度)都将丢失。
因此,问题是您已使用指针调用myfunc
到数组;然后,myfunc
函数将看不到有关该数组的所有元数据。然后,这会触发sizeof
运算符的细微差别,即当它应用于指针时,它会给出指针类型的大小,而不是数组的长度。但是,当应用于数组时,它会给出数组的长度,如main
函数中所示。
简短修复,改为使用strlen
。
答案 1 :(得分:4)
虽然您将数组定义为char charArray[]
,但当您将其传递给需要char*
的函数时,charArray
正在转换为指向第一个元素的指针,因此当您在函数体中调用sizeof
,它会按预期打印指针的大小(在32位机器上为4个字节)。
Even if your function took char passedArray[]
as an argument,原始charArray
将被衰减为指向第一个元素的指针,并且通过调用sizeof
来检索此数组大小的能力将会丢失。 (见What is array decaying?)。
所以你可以调用strlen()
来检索这个C风格字符串的大小但是因为你正在编写C ++代码,那么最合理的解决方案是使用std::string
而不是C风格的字符串。 / p>
答案 2 :(得分:4)
首先,你期待什么?您已将passedArray
定义为
一个指针,所以sizeof(passedArray)
将返回大小
你机器上的指针。它还能做什么?我可以
如果您的功能是:
void myFunc( char passedArray[15] )
一个合理的人可以预期sizeof(passedArray)
为15
在这种情况下(但他错了,因为当用作
一个参数,数组由编译器转换成
一个指针,这个定义与你的完全相同。)
所有这一切的答案都是使用std::string
:
void
myFunc( std::string const& passedValue )
{
std::cout << passedValue.size() << std::endl;
}
与char[]
不同,std::string
实际上有效。 C风格数组,
无论是否作为字符串使用,都是破碎的,应该只是
用于一组非常有限的案例,主要与对象有关
具有静态生命周期和初始化问题的顺序。
答案 3 :(得分:2)
使用strlen()
而不是sizeof()
来获取字符串的长度。
在C中,字符串只是一个以零结尾的字符数组。 C中没有特殊的String
类型。strlen()
是一个函数,用于计算终止零字节之前的字符数。
sizeof()
是一个运算符,可用于确定变量或数据类型的大小。在您的情况下,sizeof()
返回char*
指针的大小(在您的平台上似乎是4个字节)。
答案 4 :(得分:1)
在函数内部,这个
cout << sizeof(passedArray) << endl;
正在打印passedArray
的大小,即char*
。指针在您的平台上的大小为4。如果将指针传递给函数,则该函数无法知道它指向固定大小数组的第一个元素。如果你想要一个固定数组的大小,那么传递一个数组,而不是一个指针:
template< class T, size_t N >
void myfunc( const T (&passedArray)[N] )
{
std::cout << N << "\n";
}
答案 5 :(得分:1)
sizeof(char*)
给出指针的大小,而不是指向字符串的大小。
你真正想要的是strlen
。
它给出main()
字符串大小的原因是因为它被定义为char[]
(在编译时已知大小的数组)而不是char*
。
答案 6 :(得分:0)
sizeof(passedArray)
返回指针passedArray
的大小,类型为char *
,在您的系统中,显然是4个字节。
改为使用strlen
,或者使用std::string