C语言 指向结构的指针的大小[重复]

pw136qt2  于 2023-04-05  发布在  其他
关注(0)|答案(3)|浏览(107)

此问题在此处已有答案

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字节吗?

hkmswyz6

hkmswyz61#

不,结构的大小是8字节,因为其中有两个4字节的字段,请尝试打印sizeof(int)sizeof(char *)并亲自查看。
当你对一个指针执行sizeof操作时,你总是得到指针的大小,而不是它指向什么。没有办法(在标准C中)得到你用malloc分配的内存大小。
还要注意的是,你的代码中有undefined behavior,因为你改变了指针p_struct,所以它不再指向你的malloc调用返回的内容。这会导致当你尝试free内存时出现未定义的行为。
代码中还有另一个未定义的行为:sizeof运算符返回一个类型为size_t的值。要打印一个类型为printfsize_t值,需要使用%zu说明符。格式说明符和参数类型不匹配会导致出现UB。
此外,指针和几乎所有其他类型的大小都取决于编译器和目标平台。现在,对于64位系统,指针通常是64位宽,即8字节。因此,如果针对64位系统,使用填充,结构将是16字节。

bzzcjhmw

bzzcjhmw2#

指针在系统上总是相同的大小,无论它们指向什么(int,char,struct等);在你的例子中,指针大小是4字节。

a5g8bdjr

a5g8bdjr3#

p_struct是一个指向结构体的 * 指针 *。指针通常需要4或8个字节。如果你想知道结构体本身的大小,你可以使用sizeof(*p_struct)。
请注意,您的代码可能会崩溃,因为您将p_struct增加了三次,然后对结果调用free(),而不是对malloc返回的原始指针调用free()。

for (i=0; i<3;i++)
{
    p_struct [i]->number = i;
    p_struct [i]->name = "string";
    printf("(*p_struct).number = %d, (*p_struct).name = %s\n", p_struct [i]->number p_struct [i]->name)
}

相关问题