-2
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
}

我相信它仍然应该在该函数中打印 15 ......

4

7 回答 7

9

这是指针和数组的经典问题。如您所见,问题在于数组衰减为指针。指针类型包含关于它指向的数据的元数据,除了指向类型的大小。所有其他元数据(例如数组长度)都会丢失。

因此,问题是您使用指向数组myfunc指针进行了调用;然后,有关数组的所有元数据对myfunc函数都是不可见的。然后这会触发sizeof运算符的细微差别,即当它应用于指针时,它给出的是指针类型的大小,而不是数组的长度。但是,当应用于数组时,它会给出数组的长度,如您在main函数中所见。

短修复,strlen改用。

于 2013-02-18T10:04:00.277 回答
4

尽管您将数组定义为char charArray[],但当您将其传递给采用 的函数时, 将char*charArray转换为指向第一个元素的指针,因此当您sizeof在函数体中调用时,它会打印指针的大小(即32 位机器上的 4 个字节)如预期的那样。

即使您的函数char passedArray[]作为参数,原始charArray值也会衰减为指向第一个元素的指针,并且通过调用检索此数组大小的能力sizeof将丢失。(请参阅什么是数组衰减?)。

因此,您可以调用strlen()以检索此 C 样式字符串的大小,但由于您正在编写 C++ 代码,因此最合理的解决方案是使用std::string而不是 C 样式字符串。

于 2013-02-18T10:07:11.033 回答
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 风格的数组,无论是否用作字符串,都已损坏,只能在非常有限的情况下使用,主要与具有静态生命周期和初始化顺序问题的对象有关。

于 2013-02-18T10:12:42.017 回答
2

使用strlen(), notsizeof()来获取字符串的长度。

在 C 中,字符串只是一个以零结尾的字符数组。C中没有特殊String类型。strlen()它是一个计算字符数直到终止零字节的函数。

sizeof()是一个运算符,可用于确定变量或数据类型的大小。在您的情况下,sizeof()返回char*指针的大小(在您的平台上似乎是 4 个字节)。

于 2013-02-18T10:03:11.417 回答
1

在函数内部,这个

cout << sizeof(passedArray) << endl;

正在打印 a 的大小passedArray,即 a char*。在您的平台上,指针大小为 4。如果您将指针传递给函数,则该函数无法知道它指向的是固定大小数组的第一个元素。如果你想要一个固定数组的大小,那么传递一个数组,而不是一个指针:

template< class T, size_t N >
void myfunc( const T (&passedArray)[N] )
{
  std::cout << N << "\n";
}
于 2013-02-18T10:03:45.200 回答
1

sizeof(char*)给出指针的大小,而不是指向字符串的大小。

你真正想要的是strlen

它给出字符串大小的原因main()是因为它被定义为 a char[](一个在编译时已知大小的数组)而不是 a char*

于 2013-02-18T10:03:57.527 回答
0

sizeof(passedArray)passedArray返回类型为 的指针的大小,char *在您的系统中,显然是 4 个字节。

改为使用strlen,或者更确切地说,使用std::string

于 2013-02-18T10:04:13.810 回答