5 回答
TA貢獻1847條經驗 獲得超7個贊
答案是不?!?/p>
C程序員做的是在某處存儲數組的大小。它可以是結構的一部分,或者程序員可以欺騙一點和malloc()更多的內存而不是請求,以便在數組開始之前存儲長度值。
TA貢獻1836條經驗 獲得超3個贊
對于動態數組(malloc或C ++ new),您需要存儲其他人提到的數組大小,或者可能構建一個處理添加,刪除,計數等的數組管理器結構。不幸的是,C不能做到這一點。 C ++,因為你基本上必須為你正在存儲的每種不同的數組類型構建它,如果你需要管理多種類型的數組,這很麻煩。
對于靜態數組,例如示例中的靜態數組,有一個用于獲取大小的公共宏,但不建議這樣做,因為它不檢查參數是否真的是靜態數組。宏雖然在實際代碼中使用,例如在Linux內核頭文件中,盡管它可能與下面的稍有不同:
#if !defined(ARRAY_SIZE)
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))#endifint main(){
int days[] = {1,2,3,4,5};
int *ptr = days;
printf("%u\n", ARRAY_SIZE(days));
printf("%u\n", sizeof(ptr));
return 0;}你可以google出于對這類宏的警惕。小心。
如果可能的話,C ++ stdlib如vector,它更安全,更易于使用。
TA貢獻1859條經驗 獲得超6個贊
有一個使用C ++模板的干凈解決方案,不使用sizeof()。以下getSize()函數返回任何靜態數組的大?。?/p>
#include <cstddef>template<typename T, size_t SIZE>size_t getSize(T (&)[SIZE]) {
return SIZE;}這是一個foo_t結構的示例:
#include <cstddef>template<typename T, size_t SIZE>size_t getSize(T (&)[SIZE]) {
return SIZE;}struct foo_t {
int ball;};int main(){
foo_t foos3[] = {{1},{2},{3}};
foo_t foos5[] = {{1},{2},{3},{4},{5}};
printf("%u\n", getSize(foos3));
printf("%u\n", getSize(foos5));
return 0;}輸出:
3 5
TA貢獻1788條經驗 獲得超4個贊
對于這個具體的例子,是的,如果你使用typedef(見下文)。當然,如果你這樣做,你也可以使用SIZEOF_DAYS,因為你知道指針指向的是什么。
如果你有一個(void *)指針,就像malloc()等返回的那樣,那么,不,沒有辦法確定指針所指向的數據結構,因此無法確定其大小。
#include <stdio.h>#define NUM_DAYS 5typedef int days_t[ NUM_DAYS ];#define SIZEOF_DAYS ( sizeof( days_t ) )int main() {
days_t days;
days_t *ptr = &days;
printf( "SIZEOF_DAYS: %u\n", SIZEOF_DAYS );
printf( "sizeof(days): %u\n", sizeof(days) );
printf( "sizeof(*ptr): %u\n", sizeof(*ptr) );
printf( "sizeof(ptr): %u\n", sizeof(ptr) );
return 0;}輸出:
SIZEOF_DAYS: 20sizeof(days): 20sizeof(*ptr): 20sizeof(ptr): 4
- 5 回答
- 0 關注
- 1315 瀏覽
添加回答
舉報
