홈 > IT > 질문답변
질문답변

malloc을 이용한 동적 할당에 대해 초보가 질문드립니다..

1 스레기 5 684
unsigned strnumber = 128;
unsigned strlength = 1024;
char** c = (char**)malloc(strnumber*sizeof(char*)); // 문자열 포인터를 strnumber만큼 할당
for(int n=0;n<strnumber;n++)
{
c[n] = (char*)malloc(strlength*sizeof(char)); //strlength개의 문자열 할당
}

질문
1. 주석에 써진것처럼 이중배열처럼 할당하고 싶은데 저렇게 할당하는게 맞는건가요?
2. 할당 해제할때 free(c); 로 하면 되는걸까요? 반복문 써서 free(c[n])하는 식으로 하면 디버그중 예외가 발생하던거 같은데

동적 할당에 대해 잘 몰라서 질문드려요 ㅠㅠ
5 Comments
1 스레기 04.14 22:59  
아무도 대답안해줬지만 그냥 free(c)하는게 맞는거같습니다..아님말구
3 Selovic 04.15 18:10  
굳이 반복문을 사용할 이유가 없지 않나요...?
1 스레기 04.19 22:12  
strnumber와 strlength가 상수라면 그냥 하면 되겠지만 유동적인 경우일때 어떻게 해야할지 고민중에 질문 하게 되었습니다
3 realdragonhead 04.16 15:02  
1. for문을 이용한다면 게시글로 올린방법이 맞는것 같습니다.
2. 반복문을 사용하여 이중할당을 해주었다면 마찬가지로 반복문을 써서 free(c[n]) 를 해주어야 맞는것 같습니다. 게시글 내용 코드를 바탕으로 코드를 작성해보면, 다음과 같은데.
#include <stdio.h>
#include <stdlib.h>

void main() {
        int strnumber = 12;
        int strlength = 50;

        char ** c = (char **)malloc(sizeof(char*)*strnumber);

        for(int n=0; n<strnumber; n++) {
                c[n] = (char *)malloc(sizeof(char)*strlength);
        }

        for(int i = 0; i<=3; i++) {
                scanf("%s", &c[i][0]);
        }

        for(int a = 0; a<=3; a++) {
                printf("%s\n", &c[a][0]);
        }

        free(c);
}
코드를 컴파일하여 gdb 를 통해 돌려보면

0x0000000000400639 <+35>:    call  0x4004f0 <malloc@plt>
 이 부분과
mov    eax,DWORD PTR [rbp-0x2c]
  0x000000000040064e <+56>:    cdqe
  0x0000000000400650 <+58>:    lea    rdx,[rax*8+0x0]
  0x0000000000400658 <+66>:    mov    rax,QWORD PTR [rbp-0x18]
  0x000000000040065c <+70>:    lea    rbx,[rdx+rax*1]
  0x0000000000400660 <+74>:    mov    eax,DWORD PTR [rbp-0x1c]
  0x0000000000400663 <+77>:    cdqe
  0x0000000000400665 <+79>:    mov    rdi,rax
  0x0000000000400668 <+82>:    call  0x4004f0 <malloc@plt>
  0x000000000040066d <+87>:    mov    QWORD PTR [rbx],rax
  0x0000000000400670 <+90>:    add    DWORD PTR [rbp-0x2c],0x1
  0x0000000000400674 <+94>:    mov    eax,DWORD PTR [rbp-0x2c]
  0x0000000000400677 <+97>:    cmp    eax,DWORD PTR [rbp-0x20]
  0x000000000040067a <+100>:  jl    0x40064b <main+53>
이렇게 반복문 부분을 찾아볼수 있는데
이런식으로 두번 첫번째 이중배열 동적할당과 반복문을 통한 동적할당으로 두번 하는데
0x00000000004006f1 <+219>:  call  0x4004c0 <free@plt>
이렇게 마지막 free 함수 한번 밖에 호출을 하지 않습니다. 즉 이중배열 처음 동적할당에만 free 만 적용이 되었다는 건데, 간단한 코드라면 상관 없겠지만, 길이가 길어지고 메모리를 점점 먹는 프로그램이라면 메모리 공간을 쓰지도 않는데 할당되는 값들이 생기기 때문에 프로그램에 에러가 생길수도 있으니, 반복문을 이용하여 동적할당을 해제시켜주는것이 맞는거 같습니다.
1 스레기 04.19 22:13  
답변 감사합니다
Category
Facebook Twitter GooglePlus KakaoStory KakaoTalk NaverBand
PlusFriend Chat