假设我想写(在C99中)以下函数:
NAME: primes
INPUT: an integer n > 0
OUTPUT: int array filled with the prime numbers in range [2, n]
Run Code Online (Sandbox Code Playgroud)
如何从我的函数中返回这样的数组?那可能吗?
请注意,我不希望调用者分配一个n * sizeof(int)我将用0(复合)和1(素数)填充的数组.
我不能只返回一个指向数组的指针,因为调用者无法知道数组有多长:
int * primes(int n)
{
int * arr = malloc(n * sizeof(int));
// do stuff
return arr;
}
int main(void)
{
int * arr = primes(100);
printf("%lu \n", sizeof arr); // prints 8
}
Run Code Online (Sandbox Code Playgroud)
我无法改变这样的签名:
int (*primes(int n))[LENGTH]
Run Code Online (Sandbox Code Playgroud)
因为LENGTH在编译时是未知的.
我在某处读到类似"用数组返回一个结构是一个可怕的想法",而且......好吧......这是我的最后一个想法.
在这种情况下,最佳做法是什么?
如果您调用的函数必须决定它需要分配的实际元素数,则应该将指针传递给分配的长度以及其余参数,如下所示:
size_t actual_length;
int *arr = primes(100, &actual_length);
if (arr == NULL) {
... // Report an error
}
for (size_t i = 0 ; i != actual_length ; i++) {
printf("%d\n", array[i]);
}
Run Code Online (Sandbox Code Playgroud)
该primes则是这样的:
int *primes(int count, size_t *actual_length) {
size_t primes_needed = ...
int *res = malloc(sizeof(*res)*primes_needed);
*actual_length = primes_needed;
// Do calculations, perhaps some reallocs
// Don't forget to reassign *actual_length = ... on realloc
...
return res;
}
Run Code Online (Sandbox Code Playgroud)