프로그래밍
첫 페이지 회원가입 로그인
비공개 손님 2022-01-06 06:55:07
[C] 함수에서 포인터 객체 해제 질문

1. 큰 배열에서 부분 배열을 찾아내는 함수를 만들었는데요, sub_region 함수 보시면 입력 인자중 하나가 포인터인데 이것도 함수 끝날 때 해제 해줄수가 있나요?

2. 그리고 함수에서 포인터를 반환 시키고 싶은데 만약 이 포인터가 동적 할당된 객체면 어떻게/어디서 반환 시켜야 하나요? 제가 작성한 코드에서 sug_region 함수 끝자락에 보면 포인터 객체를 반환시키고 나서 이걸 해체시키는데 이런 방법도 괜찮나요? 만약 안괜찮다면 어디서/어떻게 해제히켜야 하나요?

#include <stdio.h>
#include <stdlib.h>


float *sub_region(float *in_fld, int in_fld_nx, int in_fld_ny, int in_sub_nx, int in_sub_ny, int in_sub_num);


int main()
{
   int   i,j,k;
   int   x_siz = 12,
         y_siz = 12,
         sub_region_x_siz = 3,
         sub_region_y_siz = 6,
         sub_region_siz   = x_siz/sub_region_x_siz * y_siz/sub_region_y_siz;
   float *arr = malloc(sizeof(float) * x_siz * y_siz),
         *sub = malloc(sizeof(float) * sub_region_x_siz * sub_region_y_siz);

   printf("orig arrayn");
   for (j=0;j<y_siz;j++)
   {
      for (i=0;i<x_siz;i++)
      {
         arr[j * x_siz + i] = j * x_siz + i;
         //printf("%3d  %3.1fn",j * x_size + i, arr[j * x_size + i]);
         printf("%3d  ",j * x_siz + i);
      }
   printf("n");

   }

   for (k=0;k<sub_region_siz;k++)
   {
      sub = sub_region((float*)arr, x_siz, y_siz, sub_region_x_siz, sub_region_y_siz, k);


      printf("nnsub area : %d nn",k);
      for (j=0;j<sub_region_y_siz;j++)
      {
         for (i=0;i<sub_region_x_siz;i++)
         {
            printf("%3.0f  ",sub[j * sub_region_x_siz + i]);
         }
         printf("n");
      }

   }


   free(arr);
   free(sub);
  
   return 0;
}



float *sub_region(
                 float *in_fld    ,
                 int    in_fld_nx ,
                 int    in_fld_ny ,
                 int    in_sub_nx ,
                 int    in_sub_ny ,
                 int    in_sub_num
                 )
{
// function that sub-sets a specified size of an input array
// inputs  :
//  1. *in_fld     : 2d field array                              [float* ]
//  2. in_fld_nx   : size of x dimension of the 2d field array   [integer]
//  3. in_fld_ny   : size of y dimension of the 2d field array   [integer]
//  4. in_sub_nx   : size of x dimension of the sub-set array    [integer]
//  5. in_sub_ny   : size of y dimension of the sub-set array    [integer]
//  6. in_sub_num  : number of sub-set array                     [integer]
//
// outputs :
//  1. out_arr     : sub-set array                               [float* ]

   int   i,j;
   int   x_idx_siz   =  in_fld_nx/in_sub_nx  ,
         y_idx_siz   =  in_fld_ny/in_sub_ny  ,
         y_stride    =  in_fld_ny * in_sub_ny,
         *lt_idxs    =  malloc(sizeof(int) * x_idx_siz * y_idx_siz);

   float *out_arr    =  malloc(sizeof(float) * in_sub_nx * in_sub_ny);

   printf("ny stride : %dn",y_stride);
   printf("idxs: ");

   // calculating left top indexes for the sub-set arrays (x-direction)
   for (j=0;j<y_idx_siz;j++)
      for (i=0;i<x_idx_siz;i++)
      {
         lt_idxs[j * x_idx_siz + i]  = j * y_stride + i * in_sub_nx;
         printf("%d ",j * y_stride + i * in_sub_nx);
      }

   // sub-setting array
   for (j=0;j<in_sub_ny;j++)
      for (i=0;i<in_sub_nx;i++)
      {
         out_arr[j * in_sub_nx + i] = in_fld[lt_idxs[in_sub_num] + j * in_fld_nx + i];
      }


   return out_arr;
   free(out_arr);
   free(lt_idxs);
   free(in_fld);
}

감사합니다.

잡담 | 638명이 읽었어요. 3.215.79.68 |

0
1 비공개 손님 2022-01-06 10:22:03
끝자락만 읽었습니다만
함수를 리턴하면 리턴 이후 코드는 실행되지 않고 함수가 종료됩니다
그렇다고 리턴 전에 free하시거나 반환 포인터 사용 전 free하시면 의미 없는 함수가 됩니다.
불필요한 포인터는 리턴 전에 해제하시고 사용할 포인터는 사용 후 해제하세요
2 비공개 손님 2022-01-06 11:50:13
이전 질문들이랑 보면 앞으로도 계속 C를 쓰실거 같은데
C 기초 책을 하나 사서 보시던가, 인프런 같은데서라두 인강 하나 보시는걸 추천합니다.
물어보시던 내용들은 전부 기초적인 내용들이라서 아마 기본 책들만 보셔도 다 마스터 하실 거에요
물논 알지롱에 물어보면 다 알려주긴 하지만 비효율적이니깐영

답 1. 네 가능합니다. 그냥 아무데서나 free 호출하면 됩니다.
답 2. return 키워드 뒤의 내용들은 실행되지 않습니다. 고로 free 되지 않습니다. free는 항상 해당 포인터를 마지막으로 사용한 위치에서 호출하셔야 합니다.
3 비공개 손님 2022-01-06 12:02:16
감사합니다. return 이후로는 아무것도 실행 안된다는걸 알고 있었는데 예전에 어디 이상한데서 주워들은게 있어서 계속 써왔네요;;;; 아무런 생각 안하고 최근에 프로그램 실행하다가 메모리가 새는거 같아서 다시 봤네요.
4 비공개 손님 2022-01-06 12:08:13
다른 질문이 하나 더 있는데요. 위의 코드에서 같이 sub_region 함수를 여러번 불러야하는 경우에는 제가 사용한 함수의 방식이 잘못된 사용된건가요? 함수 내에서 free가 되지는 않고, 메인 함수 끝에서만 free 되니까 fpr loop 안에서는 반복적인 함수 호출 때문에 메모리가 새는게 맞는가요?
5 비공개 손님 2022-01-06 19:56:36
네 실제론 하나도 해제 안되고 있는 겁니다
6 비공개 손님 2022-01-07 04:21:48
5// 하... 그럼 지금 까지 삽질 한거군요... 답변 감사합니다.
댓글을 작성하실 수 없습니다.
(권한이 없는 회원레벨)
목록으로
△ 이전글: 30대 일반인 게임만들기 도전 결과 및 수익! [3]
▽ 다음글: 형님덜 도와주세요 이거 어케해야 묶을수있어요? [12]
이용약관 | 광고/제휴 | 개인정보취급방침 | 문의/신고 | 모바일 TE31 | 서버 부하 : 5.25%
실시간 Issue 커뮤니티 TE31 [알지롱] ⓒ 2002-2021
TOP arrow_upward