为什么传递给函数时结构数组的大小会发生变化?

时间:2016-12-15 08:41:36

标签: c++ c

#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的大小不同?

3 个答案:

答案 0 :(得分:5)

指针传递给函数的结构。并且你得到指针的大小而不是它指向的数据。

如果将数组传递给函数,则总是需要将数组中的元素数作为单独的参数传递给函数。

使用C ++还有其他选择,例如"size of array" templates。或std::array(或可选std::vector)。

答案 1 :(得分: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
}

答案 2 :(得分:0)

将数组decays指向指针。由于它的类型和维度信息丢失,它是一个struct数组还是任何原始数据类型都是无关紧要的。

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

请注意,sizeof(pointer)也可以是4个字节,具体取决于系统。