为何数组长度计算在main中正确,在自定义函数中错误?
数组长度计算错误的原因与解决方法
问题代码
#include <iostream> @brief calculates and prints array size @param string the array void function(char* string){ int n = sizeof(string)/sizeof(char); //should be size of the array given printf("%d",n); //prints INCORRECT size - 8 } int main(){ char str[] = "abcd"; //size is 5 printf("%d",(sizeof(str)/sizeof(char)); //prints correct size - 5 }
问题描述
我使用代码中的公式计算数组长度时,在main函数中能得到正确结果,但在自定义函数中得到错误值。main中计算结果为5(正确),函数中结果为8(错误),请问这是为什么?我尝试计算数组长度,期望得到正确数值。
原因分析
- 在
main函数内,str是固定大小的数组类型,sizeof(str)计算的是整个数组的总字节数:这里"abcd"加上末尾用于标识字符串结束的'\0',一共5个char,每个char占1字节,所以sizeof(str)等于5,除以sizeof(char)后得到正确的数组长度5。 - 当你把数组作为参数传递给
function函数时,数组会自动退化为指向首元素的指针。此时char* string本质是一个指针变量,在64位系统中,指针类型的大小是8字节,所以sizeof(string)的结果是8,除以sizeof(char)(1字节)就得到了错误的8。
解决方式
如果你需要在函数中获取数组的真实长度,可以用以下几种方法:
1. 手动传递长度参数
调用函数时,提前计算好数组长度并作为参数传入:
#include <iostream> void function(char* string, int length){ printf("%d", length); } int main(){ char str[] = "abcd"; int len = sizeof(str)/sizeof(char); function(str, len); // 输出5 }
2. 用模板推导数组大小(C++专属)
利用C++模板让编译器自动推导出数组的大小,避免退化问题:
#include <iostream> template <size_t N> void function(char (&string)[N]){ printf("%zu", N); // N就是数组的实际长度 } int main(){ char str[] = "abcd"; function(str); // 编译器自动推导N=5,输出5 }
3. 针对C风格字符串使用strlen
如果是字符串数组,可以用strlen函数获取有效字符长度(注意strlen不包含末尾的'\0',如果需要包含则加1):
#include <iostream> #include <cstring> // 必须包含该头文件 void function(char* string){ // strlen返回4,加1后得到包含'\0'的总长度5 printf("%zu", strlen(string) + 1); } int main(){ char str[] = "abcd"; function(str); // 输出5 }
内容的提问来源于stack exchange,提问作者Mark Y
相关产品推荐
相关产品推荐

