2016-12-15 62 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个字节,以及根据系统。

相关问题