传递给函数的char *缩短为四个字符

时间:2013-02-18 10:02:07

标签: c++ arrays parameter-passing sizeof

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
}

我相信它仍然应该在该功能中打印出来......

7 个答案:

答案 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