천하의 하수를 구원해 주세요. realloc() 관련

neohwang의 이미지

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
	struct list
	{
		int	id;
		unsigned long time;
	};
	struct list **list=NULL;

	int i,j;

	for(i=0;i<100;i++)
	{
		if(i==0)	list=malloc(sizeof(struct list));
		else	list=realloc(list,(i+1)*sizeof(struct list));

		if(list==NULL)	break;

		list[i]->id = i;
		list[i]->time = 4444;
	}

	if(i>0)
	{
		for(j=0;j<i;j++)	printf("%d %ld\n",list[i]->id, list[i]->time);
		free(list);
	}

	return 0;
}

위 코드를 컴파일 하면

Quote:
a.c: In function `main':
a.c:17: warning: assignment makes pointer from integer without a cast
a.c:18: warning: assignment makes pointer from integer without a cast

이런 에러가 생깁니다.

실행하면

Quote:
Segmentation fault

이렇게 됩니다.

사실 제가 realloc()함수를 처음 사용해 보는데..
위의 구조체에서

Quote:
list[i]->id = i;
list[i]->time = 4444;

이렇게 대입하는 부분에서 문제가 있는 것 같습니다.
근데.... 제가 이런 상황에서 어찌해야 될지를 모르겠습니다.

이 천하의 하수를 구원해 주세요.

for1003의 이미지

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

int main(int argc, char *argv[])
{
struct list
{
int id;
unsigned long time;
};
struct list **list=NULL; // struct list *list;로 바꾸세요.

int i,j;

for(i=0;i<100;i++)
{
if(i==0) list=malloc(sizeof(struct list));
else list=realloc(list,(i+1)*sizeof(struct list));

if(list==NULL) break;

list[i]->id = i; // list[i].id = 1;
list[i]->time = 4444; // list[i].time = 4444;
}

if(i>0)
{
for(j=0;j<i;j++) printf("%d %ld\n",list[i]->id, list[i]->time);
// for(j=0;j<i;j++) printf("%d %ld\n",list[i].id, list[i].time);

free(list);
}

return 0;
}

주석문 참고 하시구요...
위에 예를 보니 realloc()설명하려고 만든 예 같은데.. 저런 코드 안씁니다. --;

neohwang의 이미지

질문자인데요.. 고맙습니다.
근데요... 그렇게 했는데 결과값이 이상합니다. 출력되어야할 "4444" 리스트가 출력이 안됩니다.
그리고, struct 형태가 반복되는 가변적인 버퍼 길이 때문에 이렇게 할려고 하는데..
이렇게 하는게 아닌가요?

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

int main(int argc, char *argv[])
{
	struct list
	{
		int	id;
		unsigned long time;
	};
	struct list *list=NULL;

	int i,j;

	for(i=0;i<10;i++)
	{
		if(i==0)	list=malloc(sizeof(struct list));
		else	list=realloc(list,(i+1)*sizeof(struct list));

		if(list==NULL)	break;

		list[i].id = i;
		list[i].time = 4444;
	}

	if(i>0)
	{
		for(j=0;j<i;j++)	printf("%d %ld\n",list[i].id, list[i].time);
		free(list);
	}

	return 0;
}
yamainu의 이미지

if(i>0)
   {
      for(j=0;j<i;j++)   printf("%d %ld\n",list[i].id, list[i].time);
      free(list);
   } 

이부분에서 4444라고 찍고 싶은거라면....
  for(j=0;j<i;j++) printf("%d %ld\n",list[j].id, list[j].time);

로 해야 겠죠..
위에서 값 셋팅하고 나오면 i==10 인데 ... list[i]면 안되죠.... :D

Programmers never die: They just GOSUB without RETURN.

neohwang의 이미지

전 역시 천하의 하수입니다.
고맙습니다.. 제대로 알려주셨는데.. 받아 먹지도 못하는 군요. 흑---

하나만 더요.
위 예제에서는 고정이 되었지만,
만약 struct 가 가변적으로 반복되는 경우에...
어떻게 버퍼를 확보하는 것이 올바은 것인지요?

위의 방식대로 realloc()함수로 struct size 만큼 증가시키는 것이 옳은지요?
첫번째 답변하신분이 요즘은 이렇게 안쓴다고 해서요.

for1003의 이미지

소스 코드를 뜯어보니.. 주석문 단곳이 잘못되었네요...
그리고 구조체 배열이 가변인 경우 링크드 리스트를 사용하는 것이 낫겠지요.
밑의 소스 코드는 자료 한개씩 늘어날때 마다 배열의 사이즈가 바뀌는데
엄청 오버헤드가 큽니다..
만약 가변 크기의 배열을 만들어쓰고 싶으시다면...
초기값으로 10개정도 공간을 할당해뒀다가 10개가 가득하면 사이즈가 2배로...
그리고 또 차면 사이즈가 2배로 이렇게 늘어가게 가는것이 나을듯싶습니다.
Java의 문자열같은 경우 위와 같이 동작합니다.
(문자열 자체가 가변 배열인건 아시죠??)
암튼 일반적인 구조체형의 가변 배열은 쓰지마시고 링크드 리스트한형태인
링크드 리스트, 이진검색트리, 해쉬테이블을 사용하세요...

코드:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
struct list
{
int id;
unsigned long time;
};
struct list *list=NULL;

int i,j;

for(i=0;i<10;i++)
{
if(i==0) list=malloc(sizeof(struct list));
else list=realloc(list,(i+1)*sizeof(struct list));

if(list==NULL) break;

list[i].id = i; [i+1].time = 4444;
}

if(i>0)
{
for(j=0;j<i;j++) printf("%d %ld\n",list[i].id, list[i].time);
// for(j=0;j<i;j++) printf("%d %ld\n",list[j].id, list[j].time);

free(list);
}
dd
return 0;
}

neohwang의 이미지

고맙습니다.. 20개씩 늘려가는 것으로 했습니다.
정말 큰 도움이 되었습니다.
감사합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.