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

如何在C语言中获取数组形参的实际大小?

解决方案:获取函数数组形参的总大小

好问题!咱们先把核心矛盾点说透:在C/C++里,数组作为函数参数传递时会自动退化为指向数组首元素的指针——这就是你在Function里用sizeof(abuffer)得到8(64位指针大小)的原因。指针本身完全不携带数组的长度信息,所以你没办法直接通过这个形参abuffer本身拿到200字节的总大小,但咱们有几个靠谱的替代方案,比硬写sizeof(BUFFER_SPACE)更灵活安全:

方案1:把数组包装进结构体传递

结构体里的数组不会发生退化,传递结构体时会完整保留数组的大小信息:

#define HUNDRED 100
typedef struct {
    WCHAR data[HUNDRED];
} BUFFER_SPACE;

void Function(BUFFER_SPACE abuffer) {
    // 这里sizeof(abuffer)直接就是200字节
    wprintf(L"sizeof abuffer : %zd\n", sizeof(abuffer)); 
}

int main() {
    BUFFER_SPACE abuffer = {0};
    Function(abuffer);
    return 0;
}

这个方案的好处是直观,缺点是如果数组很大,结构体拷贝会有性能开销,但你的场景里100个WCHAR完全没问题。

方案2:传递数组时额外传入大小参数

这是C语言里最常用的做法,手动把数组大小传给函数:

#define HUNDRED 100
typedef WCHAR BUFFER_SPACE[HUNDRED];

void Function(BUFFER_SPACE abuffer, size_t bufferSize) {
    wprintf(L"buffer total size : %zd\n", bufferSize); // 直接拿到200
}

int main() {
    BUFFER_SPACE abuffer = {0};
    // 调用时直接传sizeof(abuffer),不用硬写数值
    Function(abuffer, sizeof(abuffer));
    return 0;
}

优点是灵活性拉满,就算以后BUFFER_SPACE的定义变了,只要调用时传sizeof(abuffer)就行,函数代码不用改。

方案3:用C模板自动推导数组大小(如果允许用C)

如果你的代码可以用C++编译,模板是最安全的方案——编译器会自动推导数组的大小,还能防止误传指针:

#define HUNDRED 100
typedef WCHAR BUFFER_SPACE[HUNDRED];

// 模板参数N会自动推导为数组的元素个数(这里是100)
template <size_t N>
void Function(WCHAR (&abuffer)[N]) {
    // sizeof(abuffer)就是N*sizeof(WCHAR)=100*2=200
    wprintf(L"sizeof abuffer : %zd\n", sizeof(abuffer));
    // 还能直接拿到元素个数N
    wprintf(L"array element count : %zd\n", N);
}

int main() {
    BUFFER_SPACE abuffer = {0};
    Function(abuffer);
    return 0;
}

这个方案最省心,以后哪怕把HUNDRED改成200,代码完全不用动,而且如果有人不小心传了指针而不是数组,编译器会直接报错,从源头避免bug。

总结

回到你的问题:没办法仅通过形参abuffer本身得到200,因为它已经退化成指针了,丢失了数组大小信息。必须通过额外的信息传递(结构体、大小参数、模板推导)来获取这个值,上面的三个方案可以根据你的场景选最合适的。

内容的提问来源于stack exchange,提问作者ScienceAmateur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:54:52