亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

HUWWW 2019-05-22 13:57:37
如何找到'sizeof'(指向數組的指針)?首先,這里是一些代碼: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指向的數組的大?。ǘ皇莾H僅給出它的大小,在32位系統上是4個字節)?
查看完整描述

5 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

不,你不能。編譯器不知道指針指向的是什么。有一些技巧,比如以已知的帶外值結束數組,然后計算大小直到該值,但這不是使用sizeof。

另一個技巧是Zan提到的那個,就是把它放在某個地方。例如,如果您正在動態分配數組,請分配一個大于您需要的塊的塊,在第一個int中存儲大小,并返回ptr + 1作為指向數組的指針。當您需要大小時,遞減指針并查看隱藏值。只記得從頭開始釋放整個塊,而不僅僅是數組。


查看完整回答
反對 回復 2019-05-22
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

答案是不。”

C程序員做的是在某處存儲數組的大小。它可以是結構的一部分,或者程序員可以欺騙一點和malloc()更多的內存而不是請求,以便在數組開始之前存儲長度值。


查看完整回答
反對 回復 2019-05-22
?
米脂

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


查看完整回答
反對 回復 2019-05-22
?
BIG陽

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


查看完整回答
反對 回復 2019-05-22
?
尚方寶劍之說

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


查看完整回答
反對 回復 2019-05-22
  • 5 回答
  • 0 關注
  • 1300 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號