구조체와 malloc unsigned char* 질문입니다. 총체적 난국이네요

paaran00의 이미지

하도 답답해서 처음 가입해서 질문한번 드려봅니다.

현재 구조체를 이용해서 시리얼로 데이터를 전송하는 프로그램을 짜고 있는데

제가 아무래도 기본기가 부족한건지 제가 이해한대로 아무리 짜봐도 세그멘테이션 폴트같은게 뜨네요.

선배님들의 조언을 한번 구해봅니다.

아래는 제가 만든 코드입니다.

// 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
 
이런형태의 로그가 찍히게 됩니다.
 
뭐가 문제인지 알려주시면 정말 감사하겠습니다.
 
좋은 밤 되세요 !
shint의 이미지

ㅇ_ㅇ;;

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

paaran00의 이미지

답변감사합니다.

sendBuffer[0] = STX;

현재 이구문에서 세그멘테이션 오류가 나는걸 볼수있는데요

제 생각에는 메모리 할당까지 다해놨고 단순 대입인데

안되는 이유를 잘 모르겠습니다

STX는 0x02로 디파인 해놓은 값이구요.

klara의 이미지

bzero의 사용법과 sizeof에 대해서 다시 찾아보시는게 좋을 듯합니다.

paaran00의 이미지

답변 감사합니다.

포인트 집어 주셔서 감사합니다.

공부해보도록 하겠습니다.

댓글 달기

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