2016-12-15 61 views
0
#include<stdio.h> 
#include<string.h> 
typedef struct 
{ 
    float TotalSize; 
    float AvailableSize; 
}SdMemoryInfo; 


void SdGetMemoryUsageRespCsccToGui(SdMemoryInfo *abcdSdMemoryInfo) 
{ 
    printf("\nSize of(SdMemoryInfo): %d %d",sizeof(abcdSdMemoryInfo),sizeof(float)); //Size of abcdSdMemoryInfo 
} 

int main() 
{ 
    SdGetMemoryUsageResp mSdGetMemoryUsageResp; 
    SdMemoryInfo vSdMemoryInfo[2]; 
    vSdMemoryInfo[0].TotalSize = 1; 
    vSdMemoryInfo[0].AvailableSize = 2; 
    vSdMemoryInfo[1].TotalSize = 3; 
    vSdMemoryInfo[1].AvailableSize = 4; 


    printf("\nSize of(SdMemoryInfo): %d %d",sizeof(vSdMemoryInfo),sizeof(float)); //Size of vSdMemoryInfo 

    SdGetMemoryUsageRespCsccToGui(vSdMemoryInfo); 
} 

輸出:爲什麼傳遞函數時結構數組的大小會發生變化?

Size of(SdMemoryInfo): 16 4 
Size of(SdMemoryInfo): 8 4 

爲什麼結構陣列vSdMemoryInfoabcdSdMemoryInfo的大小不同?

+0

這是C還是C++?我可以提供一些C++答案的提示,但我需要知道。刪除另一個標籤。 –

+0

@Bill Gates - 這種情況可能是C和C++。 – Peter

+2

@Peter是的,但是OP所使用的語言的答案不同,您不能在C/C++中編譯,該語言不存在。 –

回答

5

您將指針傳遞給函數的結構。你得到指針的大小而不是它指向的數據。

如果您將數組傳遞給函數,則始終需要將數組中的元素數作爲單獨的參數傳遞給函數。

使用C++還有其他選項,但是,如"size of array" templates。或者std::array(或者可選地std::vector)。

+0

可能還需要注意的是,如果需要數組的大小(或者數組中的元素的數量),則需要分別傳遞該信息。 – Peter

0

您正在獲取函數內部指針的大小而不是結構的大小。要獲取結構的實際大小,您可以按如下方式更改函數的原型,並在計算大小時遵循指針。

#include<stdio.h> 
#include<string.h> 
typedef struct 
{ 
    float TotalSize; 
    float AvailableSize; 
}SdMemoryInfo; 


void SdGetMemoryUsageRespCsccToGui(SdMemoryInfo (*abcdSdMemoryInfo)[2]) 
{ 
    printf("\nSize of(SdMemoryInfo): %d %d",sizeof(*abcdSdMemoryInfo),sizeof(float)); //Size of abcdSdMemoryInfo 
} 

int main() 
{ 
    //SdGetMemoryUsageResp mSdGetMemoryUsageResp; 
    SdMemoryInfo vSdMemoryInfo[2]; 
    vSdMemoryInfo[0].TotalSize = 1; 
    vSdMemoryInfo[0].AvailableSize = 2; 
    vSdMemoryInfo[1].TotalSize = 3; 
    vSdMemoryInfo[1].AvailableSize = 4; 


    printf("\nSize of(SdMemoryInfo): %d %d",sizeof(vSdMemoryInfo),sizeof(float)); //Size of vSdMemoryInfo 

    SdGetMemoryUsageRespCsccToGui((SdMemoryInfo(*)[2])vSdMemoryInfo); 
    printf("\nSize of(int *): %d %d",sizeof(int *),sizeof(float)); //Size of vSdMemoryInfo 
} 
0

數組decays指針。由於其類型和維度信息丟失,因此無論它是結構數組還是任何基本數據類型都無關緊要。

Size of(SdMemoryInfo): 16 (= (sizeof(vSdMemoryInfo[0] * len) = 8*2) 4 
Size of(SdMemoryInfo): 8 (= sizeof(pointer))       4 

注意sizeof(pointer)可以是4個字節,以及根據系統。

相關問題