【问题标题】:Difference between malloc(sizeof(ptr)) and malloc(sizeof(ptr*))?malloc(sizeof(ptr)) 和 malloc(sizeof(ptr*)) 之间的区别?
【发布时间】:2020-05-31 15:51:04
【问题描述】:

我想知道这两行有什么区别:

 queue* f=(queue*)malloc(sizeof(queue));
 queue* f=(queue*)malloc(sizeof(queue*));

队列的定义如下:

typedef struct queue
{
    int arr[N];
    int tail;
}queue;

提前致谢!

【问题讨论】:

  • 所谓的“重复”是关于铸造的,但这里的关键问题是大小。投票重新开放。
  • @NateEldredge 是,但第一个答案解释了为什么在这种情况下你不应该使用这两种形式,而是malloc(sizeof *f)
  • @NateEldredge:是的,我怀疑有人看到另一个问题是相关的,因为我在答案中链接了它,但它根本不是重复的。
  • 但是好吧,你有一个完美的副本:stackoverflow.com/questions/24363427/…
  • @bruno 因为当时我没有足够的积分给他最好的答案,但现在我有,谢谢你提醒我

标签: c pointers dynamic-memory-allocation


【解决方案1】:

不同的是第二行是错的;它分配了足够的空间来存储指向queue指针,而不是queue 本身,但它被分配给假定它指向整个queue 的足够空间的类型。 p>

Neither one requires a cast,所以正确的形式是:

queue *f = malloc(sizeof(queue));

为了更安全,不要引用类型本身,而是引用你要分配的变量,以避免重复类型(如果类型更改,可能会导致维护问题);这也意味着sizeof doesn't need parentheses:

queue *f = malloc(sizeof *f);

【讨论】:

  • sizeof 如果操作数是 int 之类的类型名称或 queue 之类的 typedef 名称,则需要括号。
  • @JohnBode:啊,你是对的。我已经习惯了使用*f 表单,我忘记了命名类型本身的规则。已修复,并链接到涵盖规则的问题。
猜你喜欢
  • 2020-09-07
  • 2021-12-26
  • 2022-01-15
  • 2014-08-13
  • 2021-06-09
  • 2013-02-19
  • 2021-05-18
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多