如何在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
相关产品推荐
相关产品推荐

