質問: C原語について質問です。 構造体は関数の引数で値渡しできますが、配列はできないのでしょうか?
回答: C言語は、低級言語(それより低級な(機械語に近い)言語は、アセンブラしかないくらいの)をコンセプトに開発されてますので、スタックメモリ、ヒープメモリなどのハードウェアに近いことも、気にしながら使う必要があります。関数は、その関数が使ったスタックメモリは、その処理が完了したときに、すべて解放してしまうという仕様が、配列を返り値にできないことに、大きく関係していると考えられます。 なので、配列をヒープメモリに領域確保すれば、配列を関数の返り値にすることができます。malloc()関数を使う、というわけですね。サンプルコードを示します。 #include #include int *add(int n, int number) { int *value = (int *)malloc(sizeof(int) * number); for (int i = 0; i < number; i++) { value[i] = n; } return value; } int main() { int *value = add(4, 10); int i; for (i = 0; i < 10; i++) { printf("%d: %d\n", i, value[i]); } free(value); return 0; } 注:最後にfree()関数で、解放することをお忘れなく。 まあ、int value[10]; という宣言はできませんけどね。 なお、上のサンプルコードは、ヒープメモリを使わないのであれば、以下のように書くのが、ふつうだということは、ご存知のとおりです。 #include void add(int n, int *temp, int number) { int i; for (i = 0; i < number; i++) { temp[i] += n; } } int main() { int value[10]; int i; for (i = 0; i < 10; i++) { value[i] = 0; } add(4, value, 10); for (i = 0; i < 10; i++) { printf("%d: %d\n", i, value[i]); } return 0; } 配列も含めて、ポインタは関数の引数に渡します。