__u8 buf[0]; ??
글쓴이: puresupe / 작성시간: 토, 2009/08/01 - 2:11오전
안녕하세요.
struct irda_device{ __u16 sh; __u8 buf[0]; };
위와 같은 구조체가 있는데요.
buf[0] 의 의미를 알고싶어서 글올리게 되었습니다.
int main(void) { char n=0; unsigned long int num; struct irda_device* self; self = (struct irda_device*)malloc(125); for(n=0;n<127;){ self->buf[n] = n++; } for(n=0;n<127;n++){ printf("%d\t",self->buf[n]); } return 0; }
그리고. 위의 구조체를 이용하여, 간단한 프로그램을 짰는데요.
125바이트로 할당되었는데 buf[126]까지 값을 어떻게 사용할수 있는 궁금합니다.
Forums:
struct irda_device{
struct irda_device{
__u16 sh;
__u8 buf[0];
};
와 같은 형태는 가변적인 길이의 구조체등을 할당 할 때 사용합니다.
물론 마지막에 해당되는 변수만이 가변적인 크기가 되고요
대게 저걸 할당할때에는
struct irda_device *temp = (struct irda_device *)malloc(sizeof(struct irda_device) + sizeof(__u8) * 100);
과 같은 형식으로 취합니다. 그러면 buf는 100개의 공간을 갖는 배열이 됩니다.
아래에서 125바이트 할당해서 126까지 쓰는건 잘못된 코드라고 봅니다.
물론 장치나 OS에 따라서 메모리를 할당해 주는 단위가 있기 때문에 125 바이트가 아닌 더 큰 크기의 메모리가 할당 되어서 이상 없이 넘어간 것 같습니다.
틀린건 지적해주세요
글 도배 해보세... 룰루랄라
답변
답변 감사합니다.
여러가지 실험을 해봤는데요.
위 구조체에서 buf는 0~126까지만 참조가 되었습니다.
위의 코드는. 이전코드에서 malloc크기와 buf 참조 범위를 수정한 코드입니다.
buf는 malloc의 크기에 상관없이 127byte이상을 참조하지 못해보입니다.
어떤 이유인지 궁금합니다.
gcc 4.1.2 (FC8) 에서 테스트했습니다.
for 관련해서 흔히
for 관련해서 흔히 하는 실수가, 바로 변수의 표현범위를 생각하지 않는 거죠.
여기서는 char형 변수 n의 표현 범위인 127을 초과해서 사용을 하니까 문제가 생기게 됩니다.
혹시 무한 루프에 빠지지는 않나요? 저는 그점이 더 신기하군요.
이것과 비슷한 실수로 다음이 있습니다.
for ( unsigned u = 10; u >= 0; --u)
당연하게도... 무한 루프를 돌죠.
감사합니다. 사소한
감사합니다.
사소한것때문에 고생했네요 ㅠㅠ
댓글 달기