__u8 buf[0]; ??

puresupe의 이미지

안녕하세요.

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]까지 값을 어떻게 사용할수 있는 궁금합니다.

swirlpotato의 이미지

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 바이트가 아닌 더 큰 크기의 메모리가 할당 되어서 이상 없이 넘어간 것 같습니다.

틀린건 지적해주세요

글 도배 해보세... 룰루랄라

puresupe의 이미지

답변 감사합니다.

여러가지 실험을 해봤는데요.
위 구조체에서 buf는 0~126까지만 참조가 되었습니다.

int main(void)
{
    char n=0;
    unsigned long int num;
 
    struct irda_device* self;
 
    self = (struct irda_device*)malloc(2048);
 
    for(n=0;n<128;){
        self->buf[n] = n++;
    }
 
    for(n=0;n<128;n++){
        printf("%d\t",self->buf[n]);
    }
    putchar('\n');
 
    free(self);
    return 0;
}

위의 코드는. 이전코드에서 malloc크기와 buf 참조 범위를 수정한 코드입니다.

buf는 malloc의 크기에 상관없이 127byte이상을 참조하지 못해보입니다.

어떤 이유인지 궁금합니다.

gcc 4.1.2 (FC8) 에서 테스트했습니다.

gardner의 이미지

for 관련해서 흔히 하는 실수가, 바로 변수의 표현범위를 생각하지 않는 거죠.

여기서는 char형 변수 n의 표현 범위인 127을 초과해서 사용을 하니까 문제가 생기게 됩니다.

혹시 무한 루프에 빠지지는 않나요? 저는 그점이 더 신기하군요.

이것과 비슷한 실수로 다음이 있습니다.

for ( unsigned u = 10; u >= 0; --u)

당연하게도... 무한 루프를 돌죠.

puresupe의 이미지

감사합니다.

사소한것때문에 고생했네요 ㅠㅠ

댓글 달기

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