C语言中如何获取函数返回数组的大小?能否用sizeof替代固定循环条件?
数组指针返回后的大小获取问题解答
能不能通过函数返回的结果获知数组的大小?
不行。C语言里,当数组名被用作函数返回值(或者赋值给指针变量时),会退化为指向数组首元素的指针,完全丢失数组的大小信息。哪怕你在函数里返回的是数组的地址&a(它的实际类型是int (*)[3],即指向包含3个int的数组的指针),但在main里赋值给int* p时,会发生隐式类型转换,最终得到的还是一个普通的int指针,没有任何关于原数组长度的元数据。所以仅靠这个返回的指针,没办法直接获取数组大小。
能不能用for(i = 0; i < sizeof(p); i++)替代for(i = 0; i < 3; i++)?
绝对不行。sizeof(p)计算的是指针变量p本身的内存大小,和数组里的元素个数毫无关系:
- 在32位系统中,指针大小是4字节,这会让循环执行4次,第4次访问
*(p+3)属于数组越界,会读取未知内存,结果是未定义的(可能输出乱码,甚至程序崩溃); - 在64位系统中,指针大小是8字节,循环会执行8次,越界情况更严重。
可行的替代方案
如果不想硬编码数组长度,可以试试这两种方法:
方法1:返回包含指针和大小的结构体
把数组指针和长度打包成结构体返回,这样就能在main里拿到准确的数组大小:
#include <stdio.h> // 定义包含数组信息的结构体 typedef struct { int *data; int size; } ArrayInfo; ArrayInfo arrayReturn() { static int a[] = {11, 22, 33}; ArrayInfo info; info.data = a; // 计算数组大小:总字节数除以单个元素字节数 info.size = sizeof(a) / sizeof(a[0]); return info; } int main() { ArrayInfo info = arrayReturn(); for (int i = 0; i < info.size; i++) { printf("%d ", info.data[i]); } return 0; }
方法2:用哨兵值标记数组末尾
在数组最后添加一个不会出现在正常元素里的特殊值(比如-1,假设数组元素都是正数),循环时判断到哨兵值就停止:
#include <stdio.h> int *arrayReturn() { // 末尾添加哨兵值-1 static int a[] = {11, 22, 33, -1}; return a; } int main() { int *p = arrayReturn(); int i = 0; // 遇到哨兵值就终止循环 while (p[i] != -1) { printf("%d ", p[i]); i++; } return 0; }
内容的提问来源于stack exchange,提问作者Christofor15
相关产品推荐
相关产品推荐

