You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何数组长度计算在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:00:16