次の関数を (C99 で) 書きたいとします。
NAME: primes
INPUT: an integer n > 0
OUTPUT: int array filled with the prime numbers in range [2, n]
関数からそのような配列を返すにはどうすればよいですか? それは可能ですか?
0 (複合) と 1 (素数) で埋める配列を呼び出し元に割り当ててほしくないことに注意してください。n * sizeof(int)
呼び出し元は配列の長さを知る方法がないため、配列へのポインターを返すことはできません。
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
}
次のように署名を変更することはできません。
int (*primes(int n))[LENGTH]
LENGTH はコンパイル時に不明であるためです。
私はどこかで「構造体を配列で返すのは恐ろしい考えだ」のようなものを読みましたが、まあ... それが私の最後の考えでした。
このような場合のベストプラクティスは何ですか?