使用作为参数传入的数组指针计算数组大小

在学校实验周编写程序时,需要将程序中的结构体数组存储到文件中。我编写了一个 StoreData 函数,实现接受结构体数组的首地址并将结构体数组在二进制模式下写入文件中的功能。并编写了一个 RequestData 函数用于从文件中读取出结构体数组。编写完成后进行测试,出现了以下类似的问题(不是实际代码,是为了讲解问题简单写的):

1
2
3
4
5
6
7
/*代码片段1*/
int ExampleFunction(array) // array 是一个数组的首地址
{
size_t sizeArray = sizeof(array);
printf("Size of array is %u\n", sizeArray);
return 0;
}

我在 StoreData 函数中使用上面类似的方法计算所接受数组的大小,array 表示数组首地址。

我用这种方法的原因是因为曾经在教科书上看到了下面类似的代码:

1
2
3
4
5
6
/*代码片段2*/
.../* main() */
struct Student a[3] = {{"Lihong", 10001, 15}, {"Wanggang", 10002, 15}, {"Zhangqiang", 10003, 15}};
...
size_t studentSize = sizeof(a);
...

在上面的代码片段2中,studentSize 可以正确获得 a 的实际大小。

然而在代码片段1中,执行结果却是:

1
Size of array is 4

不能正确地计算数组的大小,导致存入文件中时数据不完整程序出错。

经过了解,原来,若在一个已经声明此指针为数组首地址的函数中,sizeof 是可以自动计算出整个数组的大小的。但是若离开了声明数组的作用域,比如上面指针作为参数传入另一个函数的时候,在这个函数内使用 sizeof 就只是计算了这个指针的大小,根据系统的不同会显示不同的大小。

所以如果要在另一个函数中计算数组大小,可以把数组的长度传入函数,使用“长度*sizeof(元素)”来计算。


使用作为参数传入的数组指针计算数组大小
https://maphical.cn/2017/07/compute-size-of-array-in-c/
作者
MaphicalYng
发布于
2017年7月23日
许可协议