如何获取C++中函数返回的数组指针指向的数组长度?
问题原因
你使用sizeof(arr)/sizeof(arr[0])计算长度失效的核心原因是:arr是int*类型的指针,不是数组类型。C++中裸指针本身仅存储内存地址,不携带其指向的内存块的长度信息,sizeof(arr)只会返回指针本身占用的内存大小(64位系统下指针占8字节,不同编译环境下的数值差异本质都是指针大小计算而非数组长度计算)。
同时你的代码存在隐藏问题:嵌套调用mergeArray时返回的堆数组指针没有被保存,也没有手动delete,会产生内存泄漏。
可行解决方案
方案1:直接复用已知的长度值
你多次调用mergeArray时已经明确传入了各数组的长度,最终合并后的数组总长度就是所有输入数组的长度之和,直接计算即可:
int main(){ int arr1[]={3, 6, 8, 10, 15}; int arr2[]={1, 5, 12}; int arr3[]={4, 8, 15, 16}; int arr4[]={2, 6}; int s1=sizeof(arr1)/sizeof(arr1[0]); int s2=sizeof(arr2)/sizeof(arr2[0]); int s3=sizeof(arr3)/sizeof(arr3[0]); int s4=sizeof(arr4)/sizeof(arr4[0]); int total_len = s1 + s2 + s3 + s4; // 直接计算总长度 int *arr= mergeArray(arr1, (mergeArray(arr2, (mergeArray(arr3, arr4, s3, s4)), s2, s3+s4)), s1, s2+s3+s4); cout<< total_len <<" "; // 用完记得释放内存避免泄漏 delete[] arr; }
方案2:修改函数返回结构包装指针与长度
如果需要让返回值自带长度信息,可以修改mergeArray返回同时包含指针和长度的结构体/std::pair:
struct MergeResult { int* data; int length; }; MergeResult mergeArray(int a[], int b[], int as, int bs){ int* temp=new int[as+bs]; int i{0}, j{0}, k{0}; while(i<as&&j<bs){ if(a[i]<b[j]) temp[k++]=a[i++]; else temp[k++]=b[j++]; } while(i<as) temp[k++]=a[i++]; while(j<bs) temp[k++]=b[j++]; return {temp, as+bs}; }
调用时直接读取返回值的length字段即可得到长度。
方案3:使用STL容器替代裸指针(推荐)
C++中std::vector容器自带长度查询、自动内存管理能力,完全避免裸指针的各类问题,改造后代码如下:
#include<bits/stdc++.h> using namespace std; vector<int> mergeArray(const vector<int>& a, const vector<int>& b){ vector<int> temp; temp.reserve(a.size() + b.size()); int i = 0, j = 0; while(i < a.size() && j < b.size()){ temp.push_back(a[i] < b[j] ? a[i++] : b[j++]); } while(i < a.size()) temp.push_back(a[i++]); while(j < b.size()) temp.push_back(b[j++]); return temp; } int main(){ vector<int> arr1 = {3, 6, 8, 10, 15}; vector<int> arr2 = {1, 5, 12}; vector<int> arr3 = {4, 8, 15, 16}; vector<int> arr4 = {2, 6}; auto arr = mergeArray(arr1, mergeArray(arr2, mergeArray(arr3, arr4))); cout << arr.size() << " "; }
内容的提问来源于stack exchange,提问作者RAVI SHAH
相关产品推荐
相关产品推荐

