【问题标题】:Size of a pointer pointing to a structure [duplicate]指向结构的指针的大小[重复]
【发布时间】:2014-07-08 19:14:30
【问题描述】:

我试图记住 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 字节的总分配大小?

【问题讨论】:

  • 请注意,在这个简单的示例中,不需要使用malloc 来分配您的结构。您可以(并且应该)尽可能在堆栈上分配数据。要在堆栈上分配结构,只需声明一个变量struct MyStruct myStruct;。分配在栈上的数据会自动释放,无需显式调用free
  • 没错,重点是我在练习动态内存分配——这就是我特别使用 malloc 的原因。

标签: c pointers structure


【解决方案1】:

不,结构的大小是 8 个字节,因为其中有两个 4 字节字段,尝试打印 sizeof(int)sizeof(char *) 并自己查看。

当您对指针执行sizeof 时,您总是会得到指针的大小,而不是指针指向的内容。没有办法(在标准 C 中)获得使用 malloc 分配的内存大小。

还请注意,您的代码中有 undefined behavior,因为您更改了指针 p_struct,因此它不再指向您的 malloc 调用返回的内容。当您尝试free 该内存时,这会导致未定义的行为。

【讨论】:

  • 谢谢,我知道八个字节的原因,但不知道未定义的行为。我想我需要将 p_struct 恢复到使用 malloc 分配的区域的开头,然后释放它。那你能在这里解释一下指针的大小吗,为什么我会得到 4 个字节?
  • sizeof(MyStruck->ThatThisStruct) 不工作是不可能的,我有 6200 个注册..
【解决方案2】:

无论指针指向什么(int、char、struct 等),系统上的指针总是相同的大小;在您的情况下,指针大小为 4 个字节。

【讨论】:

  • 这通常是不正确的。在某些实现中,不同的指针具有不同的大小。
  • 一般来说正确的。在某些特定和不寻常的情况下,它不是正确的,但通常是正确的。
  • 确实有不同大小的实现,但这些天很少见。我假设原始发布者没有在这样的机器上学习。
【解决方案3】:

p_struct 是一个指向结构的指针。指针通常占用 4 或 8 个字节。如果您想知道结构本身的大小,可以使用 sizeof (*p_struct)。

注意你的代码很可能crash,因为你增加了三倍p_struct,然后在结果上调用free(),而不是在malloc返回的原始指针上。例如,写起来更清晰、更安全

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)
}

【讨论】:

  • 谢谢,我知道了。我之前使用过相同的循环,但我特别想进行指针运算。但我明白为什么代码不稳定,我会将指针恢复 3 次以避免它。那么 sizeof(p_struct) 和 sizeof(*p_struct) 有什么区别呢?
猜你喜欢
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多