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?
答案 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()
,这是您使用的平台中指针的大小。(取决于所使用的平台)。
如果您想知道结构的大小,请使用4
或sizeof(struct busData)
答案 1 :(得分:1)
现在它显示'4'。我认为应该显示5040对吗?
不,你错了。检查数据类型。
首先,关于TimeZone.current
运算符,来自sizeof
,章节§6.5.3.4
C11
运算符产生其操作数的大小(以字节为单位),可以是 表达式或类型的括号名称。 大小取决于类型 操作数。 [...]
sizeof
是一个指针,因此,bus
与sizeof(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
后,指针将指向无效的地址。之后使用该指针访问内存是未定义的行为