구조체와 malloc unsigned char* 질문입니다. 총체적 난국이네요
글쓴이: paaran00 / 작성시간: 금, 2015/04/17 - 8:32오후
하도 답답해서 처음 가입해서 질문한번 드려봅니다.
현재 구조체를 이용해서 시리얼로 데이터를 전송하는 프로그램을 짜고 있는데
제가 아무래도 기본기가 부족한건지 제가 이해한대로 아무리 짜봐도 세그멘테이션 폴트같은게 뜨네요.
선배님들의 조언을 한번 구해봅니다.
아래는 제가 만든 코드입니다.
// message.h typedef struct _SIMPE_REQUEST_MESSAGE { unsigned char stx; unsigned int requestMessageLenth; // 요청 메시지 길이 unsigned char* requestMessage; // 요청 메시지 unsigned char etx; } SIMPE_REQUEST_MESSAGE, *LPSIMPE_REQUEST_MESSAGE; // CClient.cpp 의 일부입니다. // 단순 요청 전송 함수 string CClient::requestSimpleMessage(string input) { unsigned char* sendBuffer; unsigned char resultBuffer[MAX_DATA_LENTH]; unsigned char tempBuffer[MAX_DATA_LENTH]; SIMPE_REQUEST_MESSAGE simpleReqMessage; sendBuffer = (unsigned char*)malloc(input.length() + sizeof(simpleReqMessage)+2); bzero(&sendBuffer, sizeof(sendBuffer)); bzero(&resultBuffer, sizeof(resultBuffer)); bzero(&resultBuffer, sizeof(tempBuffer)); simpleReqMessage.stx = STX; simpleReqMessage.requestMessageLenth = input.length(); simpleReqMessage.requestMessage = (unsigned char*)malloc(input.length()); //bzero(&simpleReqMessage.requestMessage, input.length()); CMessage::logMsgln("aaaa"); memcpy(simpleReqMessage.requestMessage, (unsigned char*)input.c_str(), input.length()); CMessage::logMsgln("bbbb"); simpleReqMessage.etx = ETX; CMessage::logMsgln("1111"); sendBuffer[0] = STX; CMessage::logMsgln("2222"); memcpy(&sendBuffer[1], &simpleReqMessage, sizeof(simpleReqMessage)); CMessage::logMsgln("3333"); sendBuffer[input.length() + sizeof(simpleReqMessage) + 2] = ETX; CMessage::logMsgln("4444"); // set input mode (non-canonical<비동기화>, no echo<화면에 다시 보이지 않음> mNewtio.c_lflag = 0; mNewtio.c_cc[VTIME] = 0; // 문자 사이의 timer를 disable mNewtio.c_cc[VMIN] = 1; // 최소 1 문자 받을 때까진 blocking tcflush(mFd, TCIFLUSH); tcsetattr(mFd, TCSANOW, &mNewtio); for (int i = 0; i < sizeof(sendBuffer); i++) { CMessage::logMsgln("sendBuffer is %x", sendBuffer[i]); } write(mFd, &sendBuffer, sizeof(sendBuffer)); int i = 0; while (true) { read(mFd, tempBuffer, 1); resultBuffer[i] = tempBuffer[0]; CMessage::logMsgln("resultBuffer is %x", resultBuffer[i]); i++; if (tempBuffer[0] == ETX) break; } CMessage::logMsgln("resultBuffer is %s", resultBuffer); string resultString(reinterpret_cast<char*>(resultBuffer)); return resultString; } 시리얼 오픈등의 사전 작업은 잘되어있구요 현재 실행을 시켜보면 aaaa bbbb 1111 Segmentation fault 이런형태의 로그가 찍히게 됩니다. 뭐가 문제인지 알려주시면 정말 감사하겠습니다. 좋은 밤 되세요 !
Forums:
한줄씩 지워보세요.
ㅇ_ㅇ;;
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사드립니다.
답변감사합니다.
sendBuffer[0] = STX;
현재 이구문에서 세그멘테이션 오류가 나는걸 볼수있는데요
제 생각에는 메모리 할당까지 다해놨고 단순 대입인데
안되는 이유를 잘 모르겠습니다
STX는 0x02로 디파인 해놓은 값이구요.
bzero의 사용법과 sizeof에 대해서 다시
bzero의 사용법과 sizeof에 대해서 다시 찾아보시는게 좋을 듯합니다.
답변감사드립니다.
답변 감사합니다.
포인트 집어 주셔서 감사합니다.
공부해보도록 하겠습니다.
댓글 달기