본문 바로가기

Education

[부스트 코딩 뉴비 챌린지 2020] week4 Q&A

반응형

int 배열 반환하기

#include <stdio.h>

int* bubble_sort(int a[], int length);

int main(void){
    int a[5] = {1, 2, 3, 4, 5};
    int* b = bubble_sort(a, 5);
    return 0;
}
int* bubble_sort(int a[], int length){
    int temp;
    for(int i = 0; i < length; i++){
        for(int j = 0; j < length - 1 - i; j++){
            if(a[j] > a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    return a;
}

int* b = 함수명     〓      int* (새로운 변수명)

 

Q. 위 코드에서 새로운 변수명이 아닌 리턴 받은 값을 다시 변수 a에 저장하려면 코드를 어떻게 작성해야 할까요?

bubble_sort라는 함수가 매개변수로 a를 받은 후 함수 안에서 a에 저장된 int의 순서를 바꾸고 있으므로, bubble_sort 함수가 끝나면 자동으로 a는 정렬된 int들을 갖게 됩니다.

즉, 굳이 return a; 후 a = bubble_sort(a, 5)라고 하실 필요 없이 bubble_sort 함수가 끝난 후 main에서 그냥 a를 사용하시면 됩니다.

 

C언어에서 함수 리턴시 리턴값을 배열로 하는 것이 위험할 수도 있나요? | 아하(Aha)

> Hello, world, C언어 - C언어에서 함수 리턴 시 리턴값을 배열로 하는 것이 위험할 수가 있나요?static을 붙여서 리턴시키는 법도 있더라구요.지역변수 관련해서 문제가 생길까봐 애초에 배열 반환을

www.a-ha.io

 

Q. 위의 질문에 이어서, (1) 이전 배열에 덮어쓰는 것과 (2) 배열을 return하여 새로운 배열에 저장하는 것 둘 중에 어떤 방법이 더 효율적이며, 실제로 코드를 짤 때 어떤 방법을 더 많이 사용하는지 궁금합니다.

(1)

    bubble_sort(num, LENGTH);

...
...

void bubble_sort(int a[], int length){
    int temp;    for(int i = 0; i < length; i++){
        for(int j = 0; j < length - 1 - i; j++){
            if(a[j] > a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}

(2)

   int* num_new = bubble_sort(num, LENGTH);

...
...

int* bubble_sort(int a[], int length){
    int temp;    for(int i = 0; i < length; i++){
        for(int j = 0; j < length - 1 - i; j++){
            if(a[j] > a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
   return a;
}

 

1번 코드와 2번 코드를 비교하자면, 1번 코드가 더 효율적이라고 할 수 있습니다.

2번 코드에서는 num_new라는 새로운 변수가 선언되어 메모리를 차지하게 됩니다. 이는 num과 같은 곳을 가리키는 필요 없는 포인터로, 굳이 num_new라는 변수를 새로 선언할 필요가 없습니다.

반응형