2

child_prog() からへの配列を返そうとしていましたmain()。コードは次のようになります。

#include<stdio.h>
#include<stdlib.h>
int* child_prog(int some_input);

void main(void){
  int C[10];
  int some_input;
  C = child_prog(some_input);
}

int* child_prog(int some_input){
  static int out[10];
  // ...
  // ... some wizardry
  return out;
}

これで、コンパイラは、 (タイプである)から返された値を(タイプCである)に割り当てることができないというエラーを生成します。確かに、私が10のメモリを作成すると、プログラムは正常に動作します。しかし、コンパイラが(として定義された配列、したがってポインタとして定義された)から返された値(として定義された配列、したがって再びポインタ)を割り当てることができない理由がわかりません。int[]child_progint*Cint*mallocintsCC[10]child_progstatic int out[10]

4

4 に答える 4

5
  1. アレイに割り当てることはできません。あなたはmemcpyそれに必要です。
  2. int*!=int[]最初はsのシーケンスのを指す可能性のあるポインタですが、2番目はsのシーケンスですintintint
  3. int *C;配列の長さ(コンパイル時に不明な場合)をoutパラメーターとして使用して渡すことができます。
  4. static int out[10];edではありませんmallocが、静的です。
于 2012-05-19T06:09:32.683 に答える
1

解決策の 1 つは、C を次のように宣言することです。

int *C;

Binyamin が言ったように、静的に割り当てられているため、配列のアドレスを変更することはできません。これは、まさにあなたがしようとしているものです。

C = child_prog(some_input);
于 2012-05-19T06:24:22.560 に答える
0
#include<stdio.h>
#include<stdlib.h>

#define SUCCESS    0 
#define FAILURE    1 

int child_prog(int some_input, int *output, int output_size);

void main(void){
  int C[10];
  int some_input;
  C = child_prog(some_input, c, 10);
}

int  child_prog(int some_input, int *output, int output_size)
{
  static int source[10];
      ...
      .../*some wizardry*/

  memcpy(output, source, output_size);


     ... if (erronous Condition)
             return FAILURE;
         else

  return SUCCESS;
}
于 2012-05-19T06:34:14.560 に答える
0
  • int []isの型はint * const、それが指すメモリが定数であることを意味し、それを変更しようとするとコンパイラ エラーが発生します。と等しくないことは明らかであるint *.
  • の変数outchild_prog()静的に割り当てられます。つまり、スタック上ではなく、グローバル データ セクションのどこかにあります。したがって、 を何度呼び出してもchild_prog()、常に同じメモリ位置が返されます。
  • したがって、配列をコピーするには、memcpy(dest,src,bytes)から返されたデータを保存する場合は a を実行しますchild_prog()
于 2012-05-19T06:26:38.090 に答える