구조체 문자열 합치기를 만들었는데 뻑나서~ 도와주세여
글쓴이: skylandi / 작성시간: 목, 2004/01/01 - 3:34오후
#include <stdio.h> #include <string.h> #include <stdlib.h> struct _Msg { int iLen; char *pMsg; }; bool StructCat(struct _Msg *,struct _Msg *); int main() { struct _Msg aMsg,bMsg,cMsg; char buf[1024]; strcpy(buf,"abcde"); bMsg.iLen=strlen(buf); bMsg.pMsg=buf; memset((void *)&aMsg,0,sizeof(aMsg)); StructCat(&aMsg,&bMsg); strcpy(buf,"fghij"); cMsg.iLen=strlen(buf); cMsg.pMsg=buf; StructCat(&aMsg,&cMsg); aMsg.pMsg[aMsg.iLen]='\0'; printf("%d %s",aMsg.iLen,aMsg.pMsg); free(aMsg.pMsg); return 0; } bool StructCat(struct _Msg *pStruct1,struct _Msg *pStruct2) { struct _Msg Temp; memcpy((void *)&Temp,(const void *)pStruct1,sizeof(*pStruct1)); pStruct1->iLen=Temp.iLen+pStruct2->iLen; pStruct1->pMsg=(char *)calloc(pStruct1->iLen,sizeof(char)); if(Temp.pMsg != NULL) { strncpy(pStruct1->pMsg,Temp.pMsg,Temp.iLen); } strncpy(pStruct1->pMsg+Temp.iLen,pStruct2->pMsg,pStruct2->iLen); free((void *)Temp.pMsg); //이부분이 뻑 return 1; }
새해 복 마니 받으시길...
더 좋은 방법이 있으시면 리플좀 달아 주세영 ^^
Forums:
이 메모리는 free 할수 없습니다. 함수가 리턴한 후에 자동으로
memcpy 하면 Temp.pMsg 가리키는 메모리는 buf 입니다.
free((void *)Temp.pMsg); //이부분이 뻑
함수안에서 buf[1024] 라고 선언하면
이 메모리는 free 할수 없습니다. 선언한 함수가 리턴한 후에 자동으로 소멸되야
되거든요. buf[1024]가 할당된 메모리는 스택영역이라고 합니다.
스택영역에는 함수안에서 선언한 변수들도 있습니다.
이모두가 함수리턴후에 사라집니다.
결국 free 하려고 하는 메모리가 buf[1024] -----> 스택
이므로 뻑나는것 같네요
buf = malloc(1024); 를 할당해서 하시면 동작은 되겠군요
malloc 하면 힙영역에 생성됩니다.
힙영역에 생성된 메모리는 free에 의해서 명시적으로소멸시켜야 합니다.
char buf[1024]; // 스택, 함수 리턴후 자동소멸
char *cp = malloc(1024); // 힙, free에 의해서 소멸
뻑나는 원인은 auto 변수를 강제로 동적할당 해제하려고 했기 때문입니다
뻑나는 원인은 auto 변수를 강제로 동적할당 해제하려고 했기 때문입니다.
예를 들면,
그리고 만약 C++을 사용할줄 아는걸 알고 있는데 될수 있으면 C++을 사용하면 좋은 결과를 얻을수 있습니다. 위와 같이 스트링을 사용해야 한다면 스트링 클래스를 만들어 사용하면 좋습니다.
여기서 방금 만들어서 버그가 있을수 있습니다. 객체지향이 만병통치약 이라고는 절대로 할수 없을 겁니다. 객체지향 프로그래밍이나 구조적 프로그래밍, 정보 공학 등등도 다 쓰임새가 있고 장단점이 있습니다.
객체 지향 프로그래밍의 장점중 하나는 바로 Abstraction 입니다. 구조적 설계를 사용하더라도 충분히 사용할수 있습니다. 구조적 프로그래밍 언어인 C에서도 사용할수 있지만 C++을 추천합니다. C++은 구조적인 면과 객체지향적 면을 동시에 지원하게 설계되어 있습니다.
만약 스트링 처리 부분만 클래스를 사용하고 나머지 부분은 보통 C언어를 쓰듯이 사용한다면 객체지향의 장점과 구조적 방식의 장점을 부분적으로 나마 동시에 이용할수 있을겁니다.
그리고 C++을 아시는 분 같은데 C++을 안쓰면 섭섭(?) 하지요... :P
짝이 안맞는 동적할당은 위험합니다.malloc과 free가 짝이 되어
짝이 안맞는 동적할당은 위험합니다.
malloc과 free가 짝이 되어야 합니다.
malloc으로 만들었을때는 free를 꼭해주시고 그냥 선언한 변수에는 쓰지 마세요.
어떠한 경우에도 지키셔야 합니다. :-)
PS: C++ 답글을 쓰신 lenani님은 C++에 대한 애정이 지나치신것 같습니다. :-)
- 죠커's blog / HanIRC:#CN
[quote="lenani"]그리고 만약 C++을 사용할줄 아는걸 알고
C++을 아시는분이라면, std::string은 안쓰시나요? ;; 왜 꼭 만들어 쓰시려고 하는지...
C++은 좋아하시는데 표준 라이브러리는 마음에 안드시나요? :(
댓글 달기