2014-03-13 110 views
0

我想从我自己的结构中使用sizeof(_test.header.columns)/sizeof(struct _column)获得“列”元素数。不幸的是我总是把它作为0,因为sizeof(_test.header.columns)总是4。这里是代码:sizeof报告错误的值

struct _column{ 
    char title[40]; 
    int length; 
}; 

struct test_struct{ 

    struct{ 
     struct _column* columns; 
    }header; 

    struct{ 
     struct _column* columns; 
    }details; 

    struct{ 
     struct _column* columns; 
    }end; 
}; 

struct test_struct _test = { 

    .header = { 
     .columns = { 
      { 
       "a", 
       1, 
      }, 
      { 
       "ab", 
       2, 
      }, 
     }, 
    }, 
    .details = { 
     .columns = { 
      { 
       "b", 
       2, 
      }, 
      { 
       "bc", 
       3, 
      }, 
     }, 
    }, 
    .end = { 
     .columns = { 
      { 
       "c", 
       3, 
      }, 
      { 
       "cd", 
       4, 
      }, 
     }, 
    }, 
}; 

void testme(){ 
    char buff[20]; 
    itoa(sizeof(_test.header.columns)/sizeof(struct _column),buff,sizeof(buff)); 
    MessageBoxA(NULL,buff,NULL,NULL); 
} 

请帮我解决问题,谢谢。任何帮助,将不胜感激。

+0

您在指针上使用'sizeof',而不是数组。 –

+0

我使用了“struct _column * columns”将列声明为_column数组的声明,如果这是错误的,那么如何纠正它? – user3407088

+0

你在看testme()的输出吗,你的参数按MessageBoxA的正确顺序排列......我不知道它们是什么......为什么不用'snprintf(buffer,20,“%d “,number)' –

回答

0

您可能会尝试执行类似于以下的方法,即您在其中执行相同类型的初始化,但是作为列计数本身的一部分包括在内。

struct _column{ 
    char title[40]; 
    int length; 
}; 

struct test_struct{ 

    struct{ 
     struct _column* columns; 
     int nColumns; 
    }header; 

    struct{ 
     struct _column* columns; 
     int nColumns; 
    }details; 

    struct{ 
     struct _column* columns; 
     int nColumns; 
    }end; 
}; 

struct _column headerColumns [] = { 
      { 
       "a", 
       1 
      }, 
      { 
       "ab", 
       2 
      } 
     }; 

struct _column detailColumns[] = { 
      { 
       "b", 
       2 
      }, 
      { 
       "bc", 
       3 
      }, 
     }; 

struct _column endColumns [] = { 
      { 
       "c", 
       3 
      }, 
      { 
       "cd", 
       4 
      } 
     }; 

struct test_struct _test = { 
    { headerColumns, sizeof(headerColumns)/sizeof(headerColumns[0])}, 
    { detailColumns, sizeof(detailColumns)/sizeof(detailColumns[0])}, 
    { endColumns, sizeof(endColumns)/sizeof(endColumns[0])} 
}; 
+0

这是完美的,谢谢。 – user3407088

+0

我的荣幸。这是我工作中短暂而愉快的插曲。 –

+0

@ user3407088,如果这提供了您正在寻找的答案,请将此标记为答案。我还注意到,您至少有一个其他问题有答案,但未标记为已回答。标记为回答会增加创建答案的人员的代表人数,并将问题标记为其他人也可以从中学习的问题。因此,对任何有良好答案的问题做出回答是一个好主意。 –

0

它失败的原因是你检查指针的sizeof,它返回指针的大小,而不是指向内存地址指向的实际数组的大小。

如果你知道数组的最大长度,你可以声明它是这样:

_column[ integerSize ] 

不过,如果你知道的大小,你将不会被使用的sizeof查询它,我认为;-)你可以通过添加一个描述列数组大小的int类型的另一个属性来扩展结构体?

+2

* sizeof在一个指针上...返回它指向的内存地址的大小*;这充其量是误导(如果你问我,是完全错误的)。它只是返回一个指针的大小,通常是2的小幂,如2,4或8, – Jens

+0

好吧,我明白了,非常感谢。 – user3407088

+0

@Jens:你是对的,我更新了它,以避免混淆,因为它确实是一个公然的谎言:) –