동적메모리를 이용하다가 의문점이 생기네요~? 고수님들 가르쳐
안녕하세요~ 프로그래밍을 열심히 배우는 학생입니다. 다름이 아니라, 동적메모리를 이용하여 파일 입출력을 하다가 궁금한 점이 생겨서 이렇게 질문을 드립니다.
아래 소스를 보시다시피, 동적머모리를 배열로 선언했습니다.
char *get_info[1024]라고 했는데, 만약 이것을 그냥 배열로 선언하여 쓰면, 문자열 1024개를 넣을 수 있고, 사용하지 않아도 메모리를 잡아먹잖아요.
그런데 만약 이것을 아래의 소스처럼 count(count를 24라고 하면)만큼 malloc를 하면, malloc하지 않은 나머지 get_info 배열 1000개는 메모리를 차지하는 가요 아니면 malloc를 하지 않았기때문에 메모리를 차지하지 않는가요? 프로그램을 짜다가 문득 궁금점이 생기네요~ 고수님들 답변 부탁드립니다.
===============================================
/*
동적메모리를 이용한 파일 입출력
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 256
int main()
{
int count = 0;
int i=0;
char buffer[MAX];
char *get_info[1024];
FILE *fp;
fp = fopen("read.txt","r");
if (fp == NULL)
{
printf("File Not Open\n");
exit(1);
}
while(fgets(buffer, sizeof(buffer), fp) != NULL)
{
get_info[count] = (char *)malloc(MAX*sizeof(char));
strcpy(get_info[count],buffer);
count++;
}
for(i=0;i<count;i++)
{
printf("%s\n",get_info[i]);
}
for(i=0;i<count;i++)
{
free(get_info[i]);
}
fclose(fp);
return 0;
}
배열 자체는 당연히 메모리를 차지합니다. char* get_inf
배열 자체는 당연히 메모리를 차지합니다.
char* get_info[1024];
get_info[0] = malloc(10);
이렇게 하면 get_info는 sizeof(char*) * 1024 바이트의 메모리를 차지합니다.
그리고 malloc으로 할당한 10바이트가 추가로 필요하게 되죠.
코드를 보니 무조건 MAX 바이트를 할당하게 되어 있군요. 이러면 malloc을 쓰는
의미가 없습니다. 차라리 char get_info[1024][MAX}; 의 2차원 배열로 하는
것이 훨씬 낫죠. 만약 필요한 메모리만 할당하고 싶다면 다음과 같이 하세요.
배열 자체는 당연히 메모리를 차지합니다. char* get_inf
배열 자체는 당연히 메모리를 차지합니다.
char* get_info[1024];
get_info[0] = malloc(10);
이렇게 하면 get_info는 sizeof(char*) * 1024 바이트의 메모리를 차지합니다. 그리고 malloc으로 할당한 10바이트가 추가로 필요하게 되죠.
코드를 보니 무조건 MAX 바이트를 할당하게 되어 있군요. 이러면 malloc을 쓰는 의미가 없습니다. 차라리 char get_info[1024][MAX}; 의 2차원 배열로 하는 것이 훨씬 낫죠. 만약 필요한 메모리만 할당하고 싶다면 다음과 같이 하세요.
코드:
while(fgets(buffer, sizeof(buffer), fp) != NULL)
{
get_info[count] = malloc(strlen(buffer) + 1);
strcpy(get_info[count],buffer);
count++;
}
=============================================
답변감사드립니다.
만약, 소스코드를 고수님의 조언하신데로 고쳐서써도, 이 코드에서는 동적메모리를 할당해서 쓰는 것이 정적메모리를 사용해서 쓰는 것보다 큰 이득은 없겠네요~ 안 그런가요?
배열과 동적할당 중 어느 쪽이 낫다고 단언하기는 힘듭니다. 프로그래머의
배열과 동적할당 중 어느 쪽이 낫다고 단언하기는 힘듭니다. 프로그래머의 의도와
실행 환경 등에 따라 달라지기 때문이지요. 메모리를 아주 아껴써야 한다든지
배열이 너무 커서 스택 오버플로우가 난다든지 할 때는 동적할당을 고려할 수 있죠.
ps. 이런 문제로 '고수'라고 하시면 진짜 고수님들이 비웃습니다. :oops:
감사합니다.
답변 감사합니다. 전 늘 프로그래밍을 하면서, 동적메모리와 정적메모릴 어떻게 써야 효율적인가~ 라는 생각을 많이 했습니다. 그래서, 여러 사이트에 몇 번의 글을 올렸지만, 대답은 정확히 뭐가 효율적이다라는 대답은 없더군요~ 어떤 것이 효율적이다라는 것은 프로그래머마다 다르니깐요.
답변 진심으로 감사드립니다. 오늘도 많이 것을 배우네요~^^
프로그래밍 시작한지 얼마 안된 학생입니다.메모리 관련 공부를 하다가
프로그래밍 시작한지 얼마 안된 학생입니다.
메모리 관련 공부를 하다가 malloc 잘 이해가 되지 않아 글을 찾다가 이걸 보게 되었는데요. malloc 함수에 대해 설명좀 해주세요.
제가 이해가 안 되는 부분이 무엇이냐면요..
처음에
get_info[1024] 로 선언을 했잖아요.
그런다음
get_info[count] = malloc(strlen(buffer) + 1);
이것을 하게 되면 get_info[1024]가 잡아먹는 메모리가 buffer 의 길이+1 만큼 줄어들게 되고 나머지는 해제되는 건가요?
아님 다른 방법으로 선언하고
get_info[count] = malloc(strlen(buffer) + 1);
을 써야 되는건가요?
1%의 가능성이면 충분하다!
최선을 다하자!
[quote="kknd345"]프로그래밍 시작한지 얼마 안된 학생입니다.
malloc은 char *get_info = malloc(strlen(buffer) + 1) 처럼 포인터로 받아줘야 합니다. 그리고 님이 생각하시는 형태의 재할당은 malloc에서 일어나지 않습니다.
어떤 책을 가지고 공부하시는지는 모르겠지만 먼저 포인터를 공부하시길 바랍니다.
댓글 달기