第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何找到'sizeof'(指向數(shù)組的指針)?

如何找到'sizeof'(指向數(shù)組的指針)?

HUWWW 2019-05-22 13:57:37
如何找到'sizeof'(指向數(shù)組的指針)?首先,這里是一些代碼:int main() {     int days[] = {1,2,3,4,5};     int *ptr = days;     printf("%u\n", sizeof(days));     printf("%u\n", sizeof(ptr));     return 0;}有沒有辦法找出ptr指向的數(shù)組的大?。ǘ皇莾H僅給出它的大小,在32位系統(tǒng)上是4個(gè)字節(jié))?
查看完整描述

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ù)組。


查看完整回答
反對(duì) 回復(fù) 2019-05-22
?
aluckdog

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)度值。


查看完整回答
反對(duì) 回復(fù) 2019-05-22
?
米脂

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,它更安全,更易于使用。


查看完整回答
反對(duì) 回復(fù) 2019-05-22
?
BIG陽(yáng)

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


查看完整回答
反對(duì) 回復(fù) 2019-05-22
?
尚方寶劍之說

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


查看完整回答
反對(duì) 回復(fù) 2019-05-22
  • 5 回答
  • 0 關(guān)注
  • 1302 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)