传递到函数中的char*被缩短为四个字符

char* passed into function is shortened to four characters

本文关键字:字符 四个 函数 char      更新时间:2023-10-16
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。。。

这是指针和数组的经典问题。正如您所看到的,问题是数组会衰减为指针。指针类型除了所指向类型的大小之外,不包含任何与其所指向的数据有关的元数据。所有其他元数据(如数组长度(都将丢失。

因此,问题是您使用指向数组的指针调用了myfunc;则关于该阵列的所有元数据对于CCD_ 2函数是不可见的。这会触发sizeof运算符中的一个细微差异,即当它应用于指针时,它给出的是指针类型的大小,而不是数组的长度。然而,当应用于数组时,它会给出数组的长度,正如您在main函数中看到的那样。

短期修复,请改用strlen

首先,您期望什么?您已将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型阵列,无论是否用作字符串,都已断开,并且只应用于一组非常有限的情况,主要与对象有关具有静态生存期和初始化顺序问题。

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

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

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

使用strlen()而不是sizeof()来获取字符串的长度。

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

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

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

你真正想要的是strlen

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

在函数内部,这个

cout << sizeof(passedArray) << endl;

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

template< class T, size_t N >
void myfunc( const T (&passedArray)[N] )
{
  std::cout << N << "n";
}

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

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