2016-09-16 8 views
1
에서 반환 배열 내 질문은

, 나는이 .c 파일이있는 C 프로젝트가 : 나는 .txt 파일에서 X 정수 번호를 읽을 필요로하는 곳에C 기능

trab.c 
ordena.c 
persistencia.c 

persistencia.c인가를

trab.c에는 메인이 있습니다. 여기서 persistencia.c을 호출하여 ordena.c에서 배열을 param으로 전달하는 X (기본 매개 변수로 정의 됨) 정수 및 호출 정렬 함수의 배열을 가져와야합니다.

내 질문입니다. 그것을하기에 덜 복잡한 방법은 무엇입니까? 매개 변수를 매개 변수로 전달하는 대신 전역 배열을 선언 할 수 있습니까? malloc을 사용하여 다른 클래스의 var에 액세스 할 수 있습니까?

+0

왜 전역 배열을 선언합니까? 함수에 배열을 넘겨 주면 포인터로 변환되어 매우 간단 해집니다. 'int' 배열의 경우'void func (int * array, size_t length)'...를 시도해 볼 수 있습니다. 그냥 배열을 편집하면됩니다. – Myst

+0

C에는 '클래스의 – user3629249

답변

0

로건 라카이 좋은 답변을 가지고 있지만, 내 경험에 따르면 이 아니라면이 아닌 경우 가능한 경우 동적 할당 메모리를 반환하는 것이 다른 방법을 제시하고자합니다.

더 유연한 디자인은 포인터와 배열 크기를 허용하는 함수를 작성하는 것입니다.

또한 유지해야하는 장기 프로젝트를 작성할 때 (아마도 자신뿐만 아니라 다른 프로그램에서도 마찬가지 일 것입니다.) "관심사"를 함께 유지하는 것이 좋습니다.

좋은 예는 메모리 관리 (free)가 호출 함수에 의해 수행 될 때 메모리 할당 (malloc)이 동일한 호출 함수에서 수행되는 것이 더 낫다는 것입니다 ... 메모리 관리 문제를 다른 기능을 사용하면 향후 유지 보수 담당자가 코드에 메모리 누수를 일으킬 가능성이 커집니다.

이 경우 스택 또는 malloc을 사용하여 Array를 할당하고 함께 전달하는 것이 매우 간단합니다.

즉 메모리 관리 문제를 호출 함수 (main)로 옮기는 데 사용할 수있는 빠른 (다소 쓸모없는) 예가 있습니다. 배열 관련 함수를 호출 할 때 동적 메모리 할당과 스택 할당을 모두 사용할 수 있습니다.

size_t get_array_size(void /* or any parameters */) { 
    /* do whatever you need */ 
    return 10; /*for our example */ 
} 

void fill_array(int *arry, size_t size) { 
    while (size) { 
    size--; 
    arry[size] = 1; /* fill in data here */ 
    } 
} 

int use_array(int *arry, size_t size) { 
    fprintf(stderr, "***\n"); 
    while (size) { 
    size--; 
    arry[size] -= 1; /* do whatever */ 
    fprintf(stderr, "array[%lu] == %d\n", size, arry[size]); 
    } 
    return 0; /* or return -1 for error */ 
} 

int main(int argc, char const *argv[]) { 
    int array1[20]; 
    int *array2; 
    size_t array2_size = get_array_size(); 
    array2 = malloc(sizeof(*array2) * array2_size); 
    fill_array(array1, 20); 
    fill_array(array2, array2_size); 
    if (use_array(array1, 20)) 
    perror("WTF?! "), exit(0); 
    if (use_array(array2, array2_size)) 
    perror("WTF?! "), exit(0); 
    return 0; 
} 

그건 제 2 ¢입니다. 내 오류 관리 코드가 다소 비뚤어 질 수도 있지만 오류가 발생하면 -1을 반환하는 것이 더 일반적입니다.

3

당신은 Xint의 배열 (난 당신이 알고 사전에 #define D의 X가 있으리라 믿고있어)를 할당 할 malloc를 사용할 수 있습니다.

int *array = malloc(X * sizeof(int)); 

malloc 어레이에 pointer (메모리의 어드레스를 저장하는 변수)를 반환한다. X이 알 수없는 경우 파일을 통해 int이 몇 개인 지 확인하고 다른 사람 int* 인수를 추가하여 발신자에게 읽은 전화 번호를 알려줄 수 있습니다. free 메모리에 대한 호출자의 책임이 명확한 한 persistentia.c의 함수에서 ptr을 반환 할 수 있습니다.

이 ordena.c에서 함수에 배열을 전달하기 위해

int *readInts(); 

같은 함수 선언이 유형 int*

의 인수로 줄 것이다 볼 것이다
void ordena(int *array, size_t length); 
+0

이 없습니다. 두 가지주의 사항 : 1. 함수가 동적으로 할당 된 메모리를 반환하는 경우는 흔하지 않습니다. 메모리 관리와 관련하여 혼란스러운 우려로 인해 메모리 누수가 촉진됩니다. 2. 요소 수에 대한 정보는 어떻게됩니까? 그게'readInts'에 어떻게 들어 맞을까요? – Myst

+0

감사합니다. 이러한주의 사항에 대한 답변을 업데이트하겠습니다. –

+0

@Myst : 일반적으로 함수가 할당 된 메모리에 대한 포인터를 반환하는 것은 드문 일이라고 생각하지 않습니다. 분명히, 'malloc()'등을 통해 메모리가 할당 될 때마다 누출 될 위험이 있지만 반환되지 않을 때도 발생할 수 있습니다. 함수의 디자인과 그것을 사용하는 방법에 대한 문서화는이를 명확하게해야합니다. 비슷한 메모는 미리 할당 된 메모리를 함수로 전달할 때 적용됩니다. 재귀 함수는 몇 가지 단서를 추가합니다. 특히 인터페이스를 변경할 수없는 경우가 있습니다. 꽤 많은 변수가 필요합니다. –