2012-05-19 2 views
1

배열을 file1.c의 child_prog()에서 main()으로 리턴하려고했습니다. 아래에 의사 코드를 제공하려고합니다. 스택 배열에 malloc'ed 배열 할당

#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; 
} 

이제 컴파일러는 (있는 int * 형이다) (정수 [] 타입이다) C에 child_prog로부터 반환되는 값을 할당 할 수 없다는 에러를 발생시킨다. 비록 내가 Cint*으로 만들고 malloc을 1 ints으로 만들면 프로그램이 제대로 작동합니다. 컴파일러가 ( C[10]으로 정의 된 배열이고 그에 따라 포인터로 정의 된) child_prog (배열은 static int out[10]으로 정의되고 다시 포인터로 정의 됨)에서 반환되는 값으로 할당 할 수없는 이유를 이해할 수 없습니다.

답변

4
  1. 배열에 할당 할 수 없습니다. memcpy해야합니다.
  2. int*는! = int[]int의 일련의 int를 가리킬 수 포인터 반면, 두 번째 는 일련의입니다 int
  3. 당신은 int *C;를 사용하여 길이를 전달할 수 있습니다 out 파라미터로서의 배열 (컴파일시에 불명 한 경우)
  4. static int out[10];malloc이 아니지만 정적입니다. 이 정적으로 할당 될 때 당신은 정확하게 당신이 일을하려고하는 배열의 주소를 변경할 수 없습니다 베냐민 말했다으로

    int *C; 
    

    :

+0

알아두기 int *! = int []. 하지만, C를 int C []와는 달리 int * C로 정의하고 malloc에 ​​메모리를 알고, child_prog가 static int 배열에 대한 포인터를 C에 반환합니다. 우회 할 수 없어야합니다. memcpy 할 필요가? – Abhinav

+0

배열에 할당하는 것이 아니라 포인터에 할당하는 경우에는'memcpy'가 필요 없습니다. – MByD

+0

내 용을 많이 죽여 줘서 고마워. 오히려 빨리. – Abhinav

1

하나 개의 솔루션으로 C를 선언 할 수 있습니다 :

C = child_prog(some_input); 
+0

예, 지금 받으 셨습니다. 답장을 보내 주셔서 감사합니다. – Abhinav

0
  • int []의 종류가 가리키는 메모리를 의미하는 상수이며 int * const이고 변경하려고하면 컴파일러 오류가 발생합니다. 분명히 int *과 같지 않습니다.
  • 변수 out (child_prog())은 스택에 없지만 전역 데이터 섹션의 어딘가에 있음을 의미하는 정적으로 할당됩니다. 따라서 몇 번이나 child_prog()을 호출하더라도 동일한 메모리 위치가 항상 반환됩니다.
  • 따라서 배열을 복사하려면 child_prog()에서 반환 된 데이터를 저장하려면 memcpy(dest,src,bytes)을 수행하십시오.
+0

답장을 보내 주셔서 감사합니다. – Abhinav

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; 
}