传递到函数中的char*被缩短为四个字符
char* passed into function is shortened to four characters
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++代码,因此最合理的解决方案是使用myfunc
0而不是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
- 找到四个 10 的所有表达式
- 如何在 c++ 中存储具有值的四个参数的元组
- C++ 函数,用于查找数组中四个最小最大元素的总和不起作用
- 如何实现四个 i8 元素组的高效_mm256_madd_epi8点积
- 如何将无符号的 int 值解释为四个字母的单词?
- 如何让变量随机输出四个单词之一
- 如何校准相机焦距,平移和旋转给定四个点
- 这C++ unordered_map怎么有四个值?我以为这是一个键值对
- 我想将四个字节合并为一个数字以进行串行传输
- QT将MainWindow拆分为四个小部件
- 如何将文本文件的各个部分导入到四个不同的字符串
- Curl - 发送数百个请求,但一次只能发送四个 - 编程
- 连接四个C 下降功能无法正常工作
- 连接四个成功的组合检查适用于大多数情况,但不适用于某些情况
- 取字符数组的最后四个字符
- 如何在输出中的每四个字符之间留出一个空格
- 从四个给定的无符号字符数组中计算平均数组
- 传递到函数中的char*被缩短为四个字符
- 将四个字符的字符串转换为长字符串
- 用C++将一个字符数组中的四个元素读入另一个字符阵列