5 回答

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超22個(gè)贊
不,你不能。編譯器不知道指針指向的是什么。有一些技巧,比如以已知的帶外值結(jié)束數(shù)組,然后計(jì)算大小直到該值,但這不是使用sizeof。
另一個(gè)技巧是Zan提到的那個(gè),就是把它放在某個(gè)地方。例如,如果您正在動(dòng)態(tài)分配數(shù)組,請(qǐng)分配一個(gè)大于您需要的塊的塊,在第一個(gè)int中存儲(chǔ)大小,并返回ptr + 1作為指向數(shù)組的指針。當(dāng)您需要大小時(shí),遞減指針并查看隱藏值。只記得從頭開始釋放整個(gè)塊,而不僅僅是數(shù)組。

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊
答案是不?!?/p>
C程序員做的是在某處存儲(chǔ)數(shù)組的大小。它可以是結(jié)構(gòu)的一部分,或者程序員可以欺騙一點(diǎn)和malloc()更多的內(nèi)存而不是請(qǐng)求,以便在數(shù)組開始之前存儲(chǔ)長(zhǎng)度值。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
對(duì)于動(dòng)態(tài)數(shù)組(malloc或C ++ new),您需要存儲(chǔ)其他人提到的數(shù)組大小,或者可能構(gòu)建一個(gè)處理添加,刪除,計(jì)數(shù)等的數(shù)組管理器結(jié)構(gòu)。不幸的是,C不能做到這一點(diǎn)。 C ++,因?yàn)槟慊旧媳仨殲槟阏诖鎯?chǔ)的每種不同的數(shù)組類型構(gòu)建它,如果你需要管理多種類型的數(shù)組,這很麻煩。
對(duì)于靜態(tài)數(shù)組,例如示例中的靜態(tài)數(shù)組,有一個(gè)用于獲取大小的公共宏,但不建議這樣做,因?yàn)樗粰z查參數(shù)是否真的是靜態(tài)數(shù)組。宏雖然在實(shí)際代碼中使用,例如在Linux內(nèi)核頭文件中,盡管它可能與下面的稍有不同:
#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出于對(duì)這類宏的警惕。小心。
如果可能的話,C ++ stdlib如vector,它更安全,更易于使用。

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
有一個(gè)使用C ++模板的干凈解決方案,不使用sizeof()。以下getSize()函數(shù)返回任何靜態(tài)數(shù)組的大?。?/p>
#include <cstddef>template<typename T, size_t SIZE>size_t getSize(T (&)[SIZE]) { return SIZE;}
這是一個(gè)foo_t結(jié)構(gòu)的示例:
#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貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊
對(duì)于這個(gè)具體的例子,是的,如果你使用typedef(見下文)。當(dāng)然,如果你這樣做,你也可以使用SIZEOF_DAYS,因?yàn)槟阒乐羔樦赶虻氖鞘裁础?/p>
如果你有一個(gè)(void *)指針,就像malloc()等返回的那樣,那么,不,沒有辦法確定指針?biāo)赶虻臄?shù)據(jù)結(jié)構(gòu),因此無法確定其大小。
#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 關(guān)注
- 1302 瀏覽
添加回答
舉報(bào)