2014-10-22 3 views
0

나는 파일에서 읽은 문자열 배열에 대한 포인터를 메서드가 반환하도록 요구하고있는 작업을하고 있습니다. 이 함수는 작동하지만 반환 된 포인터를 main 함수의 변수에 할당하려고하면 null 값의 배열로 끝납니다. 여기에 내 코드입니다 : 정확하게는 { 'B'를 포함 (buildAnsArray에서)C에서 문자열 배열 반환

3 
B 
20 
1101 

ansArray '20'을 :

#include <stdio.h> 

char **buildAnsArray(){ 

    FILE *in; 
    int num, i; 

    in = fopen("data.txt", "r"); 
    fscanf(in, "%d", &num); 

    char ansArray[10][num]; 

    for(i = 0; i < num; i++){ 
     fscanf(in, "%s", ansArray[i]); 
    } 

    return ansArray; 
}; 


main(){ 
    char **ansArray = buildAnsArray(); 
} 

입력 파일 (data.txt로) 내가 함께 일하고 있어요 시작 , '1101'}하지만 ansArray (주)는 비어 있습니다. 모든 것을 main으로 옮기고 포인터를 문자열 배열로 반환하는 것에 대해 걱정할 필요는 없지만 할당을 위해서는 buildAnsArray 함수가 필요하다는 것을 알고 있습니다. 이 문제를 해결하려면 어떻게해야합니까?

+0

가능한 복제본 [C에서 함수의 반환 값에서 캡처되지 않음] (http://stackoverflow.com/questions/23046538/string-is-not-captured-from-return-value-in-function- in-c) – usr2564301

+3

이것은 당신의 문제와 관련이 있다고 확신하지는 않지만 함수에서 포인터를 반환하고 싶다면'malloc'을 사용하여 힙에 배열을 할당해야합니다. 지금 스택에 배열을 만들면 함수 호출 후 결국 정리할 수 있습니다. ( – UnholySheep

+3

) 이것은 여러 가지 형태로 * 많은 * 중복을 가지지 만 궁극적으로는 다음과 같습니다. 자동 변수의 주소 (즉, 함수가 반환되면 더 이상 존재하지 않으므로 * 정의되지 않은 동작 *을 호출합니다). 화재에 로그를 더 추가하면 결과로 생성 된 포인터 유형이 함수의 선언 된 결과 유형과도 호환되지 않습니다 ('char **'는 ** char **]와 동일하지 않습니다 **). 컴파일러가 * * *에 대해 경고하지 않으면 경고 수준을 상당히 높게 설정해야합니다. – WhozCraig

답변

1
char ansArray[10][num]; 
return ansArray; 

은 임시 변수입니다. 함수가 반환되자 마자 파괴됩니다. ...

char** ansArray = malloc(num * sizeof(char*)); 
for(i = 0; i < num; i++){ 
    char* item = malloc(10*sizeof(char)); 

    fscanf(in, "%s", item); 
    ansArray[i] = item; 

} 

... 수익을 ansArray ;

이 작업을 수행 문자열의 수는 함수에 할당되기 때문에

하고 또한 다음

main(){ 

    char **ansArray = buildAnsArray(); 
    printf("%s", ansArray[1]); 
    free(ansArray); 
} 

는, 당신은 위하지 않는, ansarray의 개별 항목을 해제 할 수 있도록도 납입을 반환해야합니다.

+0

질문에 태그가 지정되어 있습니다. C, C++ 코드 ('new'와'delete')가 도움이되지 않습니다. – UnholySheep

+0

정확히 무엇을 썼습니까? '신'? 'delete'? 이것은 C++가 아니라 게시자가 게시했습니다. C – NlightNFotis

+0

그건 속임수였습니다! 전에 malloc을 시도했지만 개별 항목을 malloc하지 않고 배열에 추가했습니다. 고마워요! –

관련 문제