c - 函数返回的动态数组的长度

标签 c arrays function pointers

我有一个函数,它接受一些变量并返回一个指向动态分配的整数数组的指针。很快我就发现了问题;在函数之外,我不知道数组中有多少元素(通过检查输入来确定它的成本太高)。

所以,我定义

typedef struct Pair {
    int* ptr;
    int length;
} Pair;

并修改函数以返回此结构。这按预期工作,但我有顾虑。我从来没有见过这样的事情。这是正确的做法吗?

最佳答案

这是正确的,因为分配函数可以返回分配大小的唯一方法是返回该信息。但是,这不是通常的和习惯的。

通常,调用者知道可能有多少元素,并相应地进行分配。示例包括 scanf(3)、regexec(3) 中的匹配表达式数组和 readv(2) 的缓冲区数组。这些函数传递数组大小,并返回填充的数字。

分配数组的函数比较少见。在标准库中执行的那些操作中,我想不出一个会返回像您这样的结构。通常,指针或计数按值返回,另一个按引用返回。例如,scandir(3) 分配一个字符指针数组。元素的个数就是函数的返回值。数组的位置被写入其地址作为参数传递的指针 (char ***)。

另一种技术是不返回内存,而是提供迭代和自由函数。示例包括 opendir(3) 和 getpwent(3)。

当然,C 标准库是在 C 函数无法返回整个结构的时代开发的。如果不是这样的话,也许他们看起来会不一样。也就是说,caller allocates 的主流习语表明您可能需要仔细考虑您是否真的喜欢设计的函数。

关于c - 函数返回的动态数组的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61331090/

相关文章:

javascript - 如何停止嵌套在函数中的时间函数?

c - 构建 C 源代码时出现的幽灵错误

c++ - 模运算的属性

php - 解析数组的最佳方式

c++ - 如何创建二维数组 C++?

java - fn : functions in XPathExpressions cause Exceptions in JDK1. 6

c - MPI Overlapping 使用C语言产生数组求和

c - 如何用netfilter抓包?

java - 查找通用数组方法中最大元素,整数,字符串,字符

arrays - Excel - 查找列中不是错误或空白的最后一个值