很抱歉这个愚蠢的问题,但我怎么知道其中有几个成员的结构的实际大小。
例如,这是我的结构:
typedef struct mastruct mastruct;
struct mastruct{
int val;
char *chaine;
float decimal;
}__attribute__((packed));
和矫揉造作:
mastruct hello =
{
23,
"Hello world!",
3.141592654
};
printf给我回复:
printf("int : %d, char* : %d, float : %d\n", sizeof(int), sizeof(char*), sizeof(float));
printf("struct size : %d\n", sizeof(hello));
int : 4, char* : 8, float : 4
struct size : 16
这是正常的,因为int + char * + float = 16字节,但这不是我想要的。我想知道内存中结构的完整大小。
例如,如果我正在撰写" Hello world !!!!!!!!!!!!!!!!!!!!!!!"而不是" Hello world!"这会修改足迹记忆,我需要知道。
通过这个例子,如果我打印结构的大小,我仍然得到16个字节:
mastruct hello =
{
23,
"Hello world! Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
3.141592654
};
答案 0 :(得分:3)
char*
是一个指针。它总是8个字节(或者你的架构中的任何大小的指针;在32位系统上,它是4个字节)。实际的字符串数据存在于其他地方,并且不属于#34;通过结构以任何方式。
您需要了解指针和内存管理。
答案 1 :(得分:1)
首先,您必须以某种方式安全地管理链接的内存。如果您使用malloc系列直接分配它,那么您已经知道了它的大小。 如果您要将其指向堆栈上的char数组,那么您又已经知道了大小(如果有疑问,请使用sizeof或strlen)。 关键是你必须寻找2种尺寸: 1.你的结构,包括(sizeof char *) 2.链条指向的实际字符串 请记住,您的char数组和结构不太可能是连续的,因此您无法使用此最终大小进行索引。
答案 2 :(得分:0)
sizeof
运算符返回其操作数的大小。在这种情况下,操作数是hello
,其类型为struct mastruct
,因此它将生成结构本身的大小,即成员变量的大小,以及填充(如果有)。
没有办法,它可以通过指针类型成员变量来测量指向的内存位置的大小。
此外,FWIW,如果不是结构成员,sizeof
将返回变量本身的类型(指针类型的大小),而不是分配的内存量,指针变量。
答案 3 :(得分:0)
您的代码正常运行。它列出了结构的大小。 struct
包含:
int
(4个字节)char *
(32位为4个字节,64位为8个字节)float
(此处为4个字节)因此总共得到16个字节。因此,它正在按照你的要求去做。
如果您想要struct
的大小和struct
所指向的事物的大小,请使用
sizeof(hello) + strlen(hello.chaine) + 1
+ 1
用于终止零。请注意,多个struct
条目可能指向相同的字符串(取决于您设置的方式),因此这不一定代表就此项目分配的总内存(仅限)。同样,它可能指向一个常量字符串,在这种情况下,不会分配(动态)内存。