此问题在此处已有答案:
Determine size of dynamically allocated memory in C(15个答案)
八年前就关门了。
我试图记住C编程的基础知识,关于指向结构的指针,我做了以下事情:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{
struct MyStruct {
int number;
char *name;
};
int i;
struct MyStruct *p_struct = (struct MyStruct *) malloc(sizeof(struct MyStruct)*3);
printf("sizeof(struct MyStruct) = %d\n", sizeof(struct MyStruct));
for (i = 0; i < 3; i++)
{
p_struct->number = i;
p_struct->name = "string";
printf("p_struct->number = %d, p_struct->name = %s\n", p_struct->number, p_struct->name);
++p_struct;
}
printf("sizeof(p_struct) = %d\n", sizeof(p_struct));
free(p_struct);
return 0;
}
我的问题是:我得到8个字节作为结构的大小,由于编译器的对齐/填充,这是可以的,因为4+4 = 8个字节,但为什么我从sizeof(p_struct)
得到4个字节?
我期望得到24(8字节x 3),为什么会这样?
如果这是正确的,我可以得到总的分配大小为24字节吗?
3条答案
按热度按时间hkmswyz61#
不,结构的大小是8字节,因为其中有两个4字节的字段,请尝试打印
sizeof(int)
和sizeof(char *)
并亲自查看。当你对一个指针执行
sizeof
操作时,你总是得到指针的大小,而不是它指向什么。没有办法(在标准C中)得到你用malloc
分配的内存大小。还要注意的是,你的代码中有undefined behavior,因为你改变了指针
p_struct
,所以它不再指向你的malloc
调用返回的内容。这会导致当你尝试free
内存时出现未定义的行为。代码中还有另一个未定义的行为:
sizeof
运算符返回一个类型为size_t
的值。要打印一个类型为printf
的size_t
值,需要使用%zu
说明符。格式说明符和参数类型不匹配会导致出现UB。此外,指针和几乎所有其他类型的大小都取决于编译器和目标平台。现在,对于64位系统,指针通常是64位宽,即8字节。因此,如果针对64位系统,使用填充,结构将是16字节。
bzzcjhmw2#
指针在系统上总是相同的大小,无论它们指向什么(int,char,struct等);在你的例子中,指针大小是4字节。
a5g8bdjr3#
p_struct是一个指向结构体的 * 指针 *。指针通常需要4或8个字节。如果你想知道结构体本身的大小,你可以使用sizeof(*p_struct)。
请注意,您的代码可能会崩溃,因为您将p_struct增加了三次,然后对结果调用free(),而不是对malloc返回的原始指针调用free()。