2014-03-13 107 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:你是對的,我更新了它,以避免混淆,因爲它確實是一個公然的謊言:) –