【问题标题】:Difference between pointers when mallocmalloc时指针之间的区别
【发布时间】:2013-12-07 13:03:59
【问题描述】:

我通常让自己成为一个结构体,并为结构体分配内存,有时为结构体内部的缓冲区分配内存。像这样:

typedef struct A
{
  char *buffer;
  int size;
} A;

然后,当我为结构进行 malloc 时,我会这样做。 (我学会了不要在 SO 上使用 malloc 返回。)

X

A *a = malloc(sizeof(a));
a->buffer = malloc(10*sizeof(a->buffer));

X和Y这个有什么区别?

是的

 A *a = malloc(sizeof(*a));
 a->buffer = malloc(10*sizeof(a->buffer));

他们似乎在做同样的事情。

【问题讨论】:

  • 我假设您的buffer 指针指向任意数量的数据?从您的代码 sn-p 中不清楚。在这种情况下,a->buffer = malloc(sizeof(a->buffer) 是错误的,因为它总是只分配 4 个字节或 8 个字节,具体取决于您是在 32 位还是 64 位机器上。
  • 区别在于sizeof(a*) 是一个语法错误,而sizeof(a) 是更微妙的错误。
  • 为什么要为我们的缓冲区分配10倍的缓冲区指针大小?
  • 我想为 10 个字符分配空间。

标签: c pointers malloc


【解决方案1】:

都不对,第二个甚至都没有编译。

您想要以下任何一种:

A * a = malloc(sizeof(A));    // repeat the type

// or:

A * a = malloc(sizeof *a);    // be smart

然后:

a->size = 213;
a->buffer = malloc(a->size);

【讨论】:

  • a->buffer = malloc(a->size); 编译器会知道size * character size吗?
  • @MikeJohn: sizeof(char) 是一个,根据定义。不过,通常情况下,您确实必须乘以类型的大小。
  • 虽然我在编辑中添加了10 * sizeof... 为什么你说第二个不能编译?
  • 不管怎样,我从你那里学到的是,它应该与指针。 malloc(sizeof *a); 谢谢。
  • @MikeJohn:这个问题已经过编辑,所以这不是合理使用时间。它最初说的是sizeof(a*),这不是有效的C。没关系。
【解决方案2】:

您应该对它进行类型转换 (A *),因为 calloc 或 malloc 返回 void *。

A *a=(a*)malloc(sizeof(A));

假设您要为 10 个字符的缓冲区分配内存

a->buffer=(char *)malloc(sizeof(char)*10);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2010-12-16
    相关资源
    最近更新 更多