천하의 하수를 구원해 주세요. realloc() 관련
글쓴이: neohwang / 작성시간: 목, 2003/11/13 - 11:20오전
#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;
이렇게 대입하는 부분에서 문제가 있는 것 같습니다.
근데.... 제가 이런 상황에서 어찌해야 될지를 모르겠습니다.
이 천하의 하수를 구원해 주세요.
Forums:
고쳐봤습니다.
#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()설명하려고 만든 예 같은데.. 저런 코드 안씁니다. --;
근데요.
질문자인데요.. 고맙습니다.
근데요... 그렇게 했는데 결과값이 이상합니다. 출력되어야할 "4444" 리스트가 출력이 안됩니다.
그리고, struct 형태가 반복되는 가변적인 버퍼 길이 때문에 이렇게 할려고 하는데..
이렇게 하는게 아닌가요?
[code:1]if(i>0) {
이부분에서 4444라고 찍고 싶은거라면....
로 해야 겠죠..
위에서 값 셋팅하고 나오면 i==10 인데 ... list[i]면 안되죠.... :D
Programmers never die: They just GOSUB without RETURN.
전 역시 하수 입니다.
전 역시 천하의 하수입니다.
고맙습니다.. 제대로 알려주셨는데.. 받아 먹지도 못하는 군요. 흑---
하나만 더요.
위 예제에서는 고정이 되었지만,
만약 struct 가 가변적으로 반복되는 경우에...
어떻게 버퍼를 확보하는 것이 올바은 것인지요?
위의 방식대로 realloc()함수로 struct size 만큼 증가시키는 것이 옳은지요?
첫번째 답변하신분이 요즘은 이렇게 안쓴다고 해서요.
소스 코드를 뜯어보니.. 주석문 단곳이 잘못되었네요...그리고 구조체
소스 코드를 뜯어보니.. 주석문 단곳이 잘못되었네요...
그리고 구조체 배열이 가변인 경우 링크드 리스트를 사용하는 것이 낫겠지요.
밑의 소스 코드는 자료 한개씩 늘어날때 마다 배열의 사이즈가 바뀌는데
엄청 오버헤드가 큽니다..
만약 가변 크기의 배열을 만들어쓰고 싶으시다면...
초기값으로 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;
}
고맙습니다.. 20개씩 늘려가는 것으로 했습니다.정말 큰 도움이 되었
고맙습니다.. 20개씩 늘려가는 것으로 했습니다.
정말 큰 도움이 되었습니다.
감사합니다.
댓글 달기