如何识别结构构件的尺寸?

时间:2017-06-02 12:07:36

标签: c pointers structure sizeof

struct busData{
int busNum;
char str[SIZE+1]; //SIZE  = 1000
};

int main(){
    struct busData *bus = (struct busData*)calloc(5, sizeof(struct busData));


printf("\n%d", sizeof(bus)); //result is 4
free(bus);    
return 0;
    }

现在它正在显示' 4'或者' 8'取决于平台的结果。我认为应该显示5040对吗?因为我使用5提供了calloc()值。那我怎么能得到5040?我正在使用3个元素,直到' bus + 2'然后我释放免费(公共汽车);我想知道剩下多少元素(它应该显示2008年)。所以我需要5040?

5 个答案:

答案 0 :(得分:2)

class Marks

    {
        public string Name { get; set; } // property to  store Name
        public int Age { get; set; } // property to store Age 
        public bool Marks0 { get; set; } // property to store Marks0 
        public bool Marks01 { get; set; } // property to store Marks01 
        public bool Marks2 { get; set; } // property to store Marks2 
        public bool Marks3 { get; set; } // property to store Marks3

    }

此处sizeof(bus) 是一个指针,因此bus将返回sizeof(),这是您使用的平台中指针的大小。(取决于所使用的平台)。
如果您想知道结构的大小,请使用4sizeof(struct busData)

答案 1 :(得分:1)

  

现在它显示'4'。我认为应该显示5040对吗?

不,你错了。检查数据类型。

首先,关于TimeZone.current运算符,来自sizeof,章节§6.5.3.4

  

C11运算符产生其操作数的大小(以字节为单位),可以是   表达式或类型的括号名称。 大小取决于类型   操作数。 [...]

sizeof是一个指针,因此,bussizeof(bus)相同,这是指针的大小,根据您的环境,它可以为您提供结果,其中,常见的nones是4或8。

之后,在结构元素之间和最后可以有填充,因此结构定义为

sizeof (struct busData*)
对于大多数环境,

定义该类型的变量并尝试通过struct busData{ int busNum; char str[SIZE+1]; //SIZE = 1000 }; 检查大小可能不会为您提供sizeof个字节。

再次引用,

  

[....]什么时候   应用于具有结构或联合类型的操作数,结果是总数   这个对象中的字节,包括内部和尾部填充。

因此,您还需要考虑填充。

那就是说,

(4+1000+1) == 1005

实际导致undefined behavior。你需要写

   printf("\n%d", sizeof(bus));

因为 printf("\n%zu", sizeof(bus)); 会产生sizeof类型的结果。

答案 2 :(得分:1)

您正在尝试输出指针bus的大小,而不是指针指向的5个对象。

尝试以下示范程序

#include <stdio.h>
#include <stdlib.h>

#define SIZE    1000

struct busData
{
    int busNum;
    char str[SIZE+1]; //SIZE  = 1000
};

int main(void) 
{
    struct busData *bus = (struct busData*)calloc(5, sizeof(struct busData));
    printf("\n%zu\n", 5 * sizeof( *bus ) );

    return 0;
}

程序输出

5040

注意转换说明符和用作printf调用的参数的表达式

    printf("\n%zu\n", 5 * sizeof( *bus ) );
               ^^     ^^^^^^^^^^^^^^^^^

考虑到指针不提供指向单个对象或对象数组的第一个对象的信息。因此,使用指针bus,您必须明确指定指针指向的对象数量。

您可以执行以下语句的相同结果

printf("\n%zu\n", sizeof( struct busData[5] ) );

答案 3 :(得分:0)

  

如何识别结构成员的大小?

使用指向动态分配内存的指针,无法知道指针指向的内存大小。

如果您需要知道malloc/calloc之后的尺寸,您只需“记住”malloc/calloc编辑的数量,即将其保存在变量中。

您可以将其包装在另一个结构中并提供create函数。类似的东西:

struct busData{
    int busNum;
    char str[SIZE+1]; //SIZE  = 1000
};

struct busDataContainer{
    size_t size;
    struct busData* busData;
};

struct busDataContainer createBusData(size_t n)
{
    struct busDataContainer c;
    c.size = n * sizeof(struct busData);
    c.busData = calloc(n, sizeof(struct busData));
    return c;
}

int main(){
    struct busDataContainer bus = createBusData(5);
    printf("\n%zu", bus.size;
    return 0;
}

答案 4 :(得分:0)

我认为代码从一开始就搞砸了。 sizeof的问题已经在其他答案中解释过了。

另一个大问题是:

  

因为我用calloc()给了5个值。那我怎么能得到5040?   我正在使用3个元素,直到'bus + 2'   然后我释放免费(公共汽车);   我想知道剩下多少元素(它应该显示2008年)。   所以我需要5040?

这听起来像你想在调用free之后使用剩余的2个元素。

首先:

你有1个指针。编译器可以告诉您指针的大小以及指针指向的单个元素的大小。 编译器不知道您为该类型的1个以上元素分配了内存,因此无法告诉您与指针大小或1个元素大小不同的任何内容。

第二

没有“使用”某些记忆的概念。对于编译器和操作系统,如果您将内容写入内存位置并不重要。它不关心某些字节是否仍然(或再次)填充为0。

第三

如果你分配一块内存并再次释放它,整个块是免费的,不能再使用了。如果您希望仍然可以使用2008字节,那就错了!调用free后,指针将指向无效的地址。之后使用该指针访问内存是未定义的行为