C - 返回未知大小的数组

Hai*_*ile 5 c arrays c99

假设我想写(在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在编译时是未知的.


我在某处读到类似"用数组返回一个结构是一个可怕的想法",而且......好吧......这是我的最后一个想法.

在这种情况下,最佳做法是什么?

das*_*ght 7

如果您调用的函数必须决定它需要分配的实际元素数,则应该将指针传递给分配的长度以及其余参数,如下所示:

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)