[완료] c언어 구조체에서 마지막에 char name[1]; 과 같이 크기 1의 배열 생성해주는 이유?
글쓴이: syayiyip / 작성시간: 월, 2011/01/17 - 4:52오후
// 정의
typedef struct _FILE_FULL_EA_INFORMATION
{
ULONG NextEntryOffset;
UCHAR Flags;
UCHAR EaNameLength;
USHORT EaValueLength;
CHAR EaName[1];
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
// 사용 예
char EA_Buffer[sizeof(FILE_FULL_EA_INFORMATION) + TDI_TRANSPORT_ADDRESS_LENGTH + sizeof(TA_IP_ADDRESS)];
PFILE_FULL_EA_INFORMATION pEA_Buffer = (PFILE_FULL_EA_INFORMATINO)EA_Buffer;
...
memcpy(pEA_Buffer->EaName, "abcdefghijklmnopqrs", pEA_Buffer->EaNameLength + 1);
-----
위의 예처럼 FILE_FULL_EA_INFORMATION 의 마지막에 EaName을 선언할 때 그냥 포인터 형으로 선언하지 않고 크기 1을 주고 나서는 사용하는데요
이유가 있는 건가요?
이런식의 사용이 FILE_FULL_EA_INFORMATION 구조체 말고도 다른 구조체에서 종종 보여서요...
조언 부탁드립니다.
Forums:
memcpy(pEA_Buffer->EaName,
위와 같이 사용할수 있게끔 하기 위해서입니다.
버퍼 다음번지를 직접 접근이 가능합니다.
포인터로 쓴다면 사용법이 달라지죠
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
망가질 것
망가질 것 같은데요...
생각해보니 삭제 되겠군요. memcpy(
생각해보니 삭제 되겠군요.
memcpy( &pEA_Buffer->EaName, data, data_size );
가 맞겠군요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
그건 더 터무니없죠.
그건 더 터무니없죠.
왜 안될까요? 되긴 합니다. 문제가 많은 코드이긴
왜 안될까요?
되긴 합니다.
문제가 많은 코드이긴 합니다만..
터무니 없다란 말에 욱하네요.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
돌아는 가겠죠. 그 코드에선 data 멤버의
돌아는 가겠죠.
그 코드에선 data 멤버의 type이 무엇이건 상관없고,
(char *) 의 의미는 보는 사람 헷갈리게 만드는 것 이상도 이하도 아니니까요.
객관적으로, 누가 이런 코드를 들고오면 뭐라고 평가하실건가요 ?
네. 코드가 엉터리인거 인정하겠습니다.
네. 코드가 엉터리인거 인정합니다.
지적해주신거 감사합니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
pointer를 사용한다면
data 영역을 따로 malloc으로 잡고 나서, header의 data가 해당 영역의 주소를 가르키도록 해야합니다.
물론 위 코드 예제는 돌아가기는 합니다만, data크기 16 대신 2를 넣으면 문제가 있는 코드가 되죠.
(역시 돌아가기는 합니다만, 영역 크기가 정확히 맞지 않지 않습니다.
더우기, char *data의 값이 pointer임에도 해당 값을 일반 data 영역으로 간주하므로, 의미상 혼란이 오게됩니다.)
data 를 포인터로 사용할 때만 말씀하신 문제가
data 를 포인터로 사용할 때만 말씀하신 문제가 나타납니다.
Fe.Head 님의 코드에선 offset 을 얻기위한 용도 밖엔 의미가 없으므로 관계 없고요.
그 자료를 네트웍으로 다른 곳에 전송해야 한다거나
그 자료를 네트웍으로 다른 곳에 전송해야 한다거나 파일에 저장해야 할 때를 생각해보세요.
포인터로 했다면 두 번 읽어서 두 번 써야하고, 포인터 자체는 제외되도록 신경써야 합니다.
..
http://minjang.egloos.com/2254472
참고하세요
참고하세요.
stack hack
http://kldp.org/node/47668
http://c-faq.com/struct/structhack.html
http://groups.google.com/group/comp.lang.c.moderated/browse_thread/thread/8c4ffee38737e501
----------------------------------------------------------------------------------------
Don't Feed the Trolls!
----------------------------------------------------------------------------------------
감사합니다.
답변해주신 모든 분들 감사드립니다.
큰 도움이 되었습니다.
엄한 답을 달아 삭제.
엄한 답을 달아 삭제.
댓글 달기