remalloc 을 구현하려구 하는데요.. 어디가 잘 못 되었는지 도저
글쓴이: shean0 / 작성시간: 금, 2003/04/04 - 11:15오전
main()
{
Recv_Buf = malloc(100);
recv_data(Recv_Buf); //<== 내부에서 데이터 받다가 버퍼(100)이 모자르면 remalloc 해서 저장하고.
free(Recv_Buf); //<== 이게 왜 에러인지??
}
즉 , while 문에서..데이터를 받다가( 이유는 원래 while문 안에서 read(sok) 이 존재하거든요..여기서는 뺏구요..그래서 next_flag를 처리해야 되기 때문이죠..)
이렇게인데요..
include<stdio.h> #include<string.h> #include<stdlib.h> #define MMS_PLUS_SIZE 100 char *MMS_Buf; unsigned int recv_MMS(int sok, char *Recv_Buf,unsigned int *last_p,unsigned int *data_len); int main() { int ret; int s; unsigned int pos_m; /*MMS_DATA 가변 길이 저장 장소 포인터 위치 */ unsigned int data_len=0; MMS_Buf=(char *)malloc(MMS_PLUS_SIZE+1); pos_m=MMS_PLUS_SIZE; ret = recv_MMS(s,MMS_Buf,&pos_m,&data_len); // ret = MMS_recv_analy(MMS_Buf,data_len); free(MMS_Buf); printf("free OK\n") ; // close(s); return 1; } unsigned int recv_MMS(int sok, char *Recv_Buf,unsigned int *last_p,unsigned int *data_len) { int ret; char tmpbuf[5]; int next_flag,next_len; /* next의 유무 & 길이 를 의미한다. */ unsigned int pos; /* 현재 저장 데이터 포인터 */ int aaa; static int tmp_test=0; memset(tmpbuf,0x0,sizeof(tmpbuf)); next_len=0; next_flag=1; pos = 0; for(int ttt=0;ttt<10;ttt++) { char a='1'; Recv_Buf[pos+ttt]=a; } while(1==next_flag) { if(tmp_test ==0) { next_len=110; next_flag=1; } //F else if((1<=tmp_test) &&(tmp_test<=5)){ next_len=110; next_flag=1; } //M else {next_len=110; next_flag=0 ;} //L tmp_test++; if(next_flag == -1) { printf("TsWayHeader Error"); return -1; } printf("next_len[%d] last_p[%d] pos[%d]\n",next_len,*last_p,pos); aaa= next_len -(*last_p-pos); while(aaa>0) //while(next_len >(*last_p-pos)) /* 여유 공간이 없다. remalloc(last+p+2048) */ { char * tmp_pointer; tmp_pointer=(char *)malloc(*last_p+MMS_PLUS_SIZE); memset(tmp_pointer,0x0,*last_p+MMS_PLUS_SIZE); memcpy(tmp_pointer,Recv_Buf,pos); printf("tmp_pointer[%s]\n",tmp_pointer); free(Recv_Buf); Recv_Buf=tmp_pointer; tmp_pointer=NULL; *last_p = *last_p +MMS_PLUS_SIZE ; aaa= next_len -(*last_p-pos); printf("remalloc : next_len[%d] last_p[%d] pos[%d]\n",next_len,*last_p,pos); } printf("=========>pos[%d]\n",pos); for(int ttt=0;ttt<next_len;ttt++) { char a='2'; Recv_Buf[pos+ttt]=a; } ret=next_len; pos += ret; /* 누적한다 */ printf("DATA readed ret[%d] cal_pos[%d]\n",ret,pos); } *data_len = pos; return 1; }
Forums:
간단하게 코드를 보면[code:1]char *buf;mai
간단하게 코드를 보면
이런식으로 보이네요.
func에서 free(buffer)는 실제 buf(전역변수)의 메모리를 free합니다.
하지만 func에서 buffer는 스택 변수이므로 새로 malloc 된 메모리의 address가 buffer에는 저장되지만 전역변수 buf에는 저장되지 않습니다.
결국 main()의 free(buf)에서 buf는 아무런 메모리를 가지고 있지 않은 포인터가 되는거죠.
원하시는 대로 작동하려면 func() 호출시에 buf의 address를 넘기셔야 합니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
댓글 달기