동적메모리를 이용하다가 의문점이 생기네요~? 고수님들 가르쳐

ins878의 이미지

안녕하세요~ 프로그래밍을 열심히 배우는 학생입니다. 다름이 아니라, 동적메모리를 이용하여 파일 입출력을 하다가 궁금한 점이 생겨서 이렇게 질문을 드립니다.
아래 소스를 보시다시피, 동적머모리를 배열로 선언했습니다.
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;

}

doldori의 이미지

배열 자체는 당연히 메모리를 차지합니다.

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++;
}
ins878의 이미지

배열 자체는 당연히 메모리를 차지합니다.

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++;
}

=============================================
답변감사드립니다.
만약, 소스코드를 고수님의 조언하신데로 고쳐서써도, 이 코드에서는 동적메모리를 할당해서 쓰는 것이 정적메모리를 사용해서 쓰는 것보다 큰 이득은 없겠네요~ 안 그런가요?

doldori의 이미지

배열과 동적할당 중 어느 쪽이 낫다고 단언하기는 힘듭니다. 프로그래머의 의도와
실행 환경 등에 따라 달라지기 때문이지요. 메모리를 아주 아껴써야 한다든지
배열이 너무 커서 스택 오버플로우가 난다든지 할 때는 동적할당을 고려할 수 있죠.

ps. 이런 문제로 '고수'라고 하시면 진짜 고수님들이 비웃습니다. :oops:

ins878의 이미지

답변 감사합니다. 전 늘 프로그래밍을 하면서, 동적메모리와 정적메모릴 어떻게 써야 효율적인가~ 라는 생각을 많이 했습니다. 그래서, 여러 사이트에 몇 번의 글을 올렸지만, 대답은 정확히 뭐가 효율적이다라는 대답은 없더군요~ 어떤 것이 효율적이다라는 것은 프로그래머마다 다르니깐요.
답변 진심으로 감사드립니다. 오늘도 많이 것을 배우네요~^^

kknd345의 이미지

프로그래밍 시작한지 얼마 안된 학생입니다.
메모리 관련 공부를 하다가 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%의 가능성이면 충분하다!
최선을 다하자!

익명 사용자의 이미지

kknd345 wrote:
프로그래밍 시작한지 얼마 안된 학생입니다.
메모리 관련 공부를 하다가 malloc 잘 이해가 되지 않아 글을 찾다가 이걸 보게 되었는데요. malloc 함수에 대해 설명좀 해주세요.

제가 이해가 안 되는 부분이 무엇이냐면요..

처음에
get_info[1024] 로 선언을 했잖아요.

그런다음

get_info[count] = malloc(strlen(buffer) + 1);

이것을 하게 되면 get_info[1024]가 잡아먹는 메모리가 buffer 의 길이+1 만큼 줄어들게 되고 나머지는 해제되는 건가요?

아님 다른 방법으로 선언하고

get_info[count] = malloc(strlen(buffer) + 1);

을 써야 되는건가요?

malloc은 char *get_info = malloc(strlen(buffer) + 1) 처럼 포인터로 받아줘야 합니다. 그리고 님이 생각하시는 형태의 재할당은 malloc에서 일어나지 않습니다.

어떤 책을 가지고 공부하시는지는 모르겠지만 먼저 포인터를 공부하시길 바랍니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.