【问题标题】:malloc of pointer to structure works why?malloc 指向结构的指针为什么有效?
【发布时间】:2018-04-03 15:20:40
【问题描述】:

在我不小心使用的代码中

    list* Head = malloc(sizeof(list*));

而不是正确的

    list* Head = malloc(sizeof(list));

创建一个新的list 类型节点,但后来它工作得很好。

所以我的问题是为什么它可以正常工作?

【问题讨论】:

  • 你的意思是工作?编译成功还是你的程序运行良好?
  • 编译成功,当我调试它时,它存储了 int 值并将其显示在内存中
  • sizeof(list*) 大于或等于 sizeof(list) 或者您有未定义的行为
  • 所以,sizeof(list *) 不大于或等于 sizeof(list),因此您有未定义的行为。如果您使用gcc,请尝试使用-fsanitize=undefined 进行编译。
  • @muhammadshoaib 请注意,未定义的行为包括“显然工作正常”。去谷歌上查询。你的错误程序可能运行 100 次,但第 101 次失败。或者,如果您在另一台计算机上编译和运行,它可能每次都失败,或者可能发生其他任何事情。

标签: c pointers malloc structure sizeof


【解决方案1】:

这里的想法是,malloc() 不知道(类型/大小)或与将要分配返回值的变量的关系。它接受输入参数,分配请求大小的内存并返回指向内存块的指针,就是这样。因此,如果您请求了错误大小的内存块,malloc() 没有什么可以阻止您这样做。一旦你使用返回的指针,你要么是

  • 在分配的大小超过目标类型所需的大小时浪费内存。
  • 当请求的大小小于目标类型所需的大小时,通过访问超出范围的内存导致undefined behavior

现在,无论哪种情况,您都可以看到它正常工作。前者在某种程度上是允许的(尽管应该避免),但后者是严格禁止的。


忠告:

为避免此类错误,请使用以下格式

  type * variable = malloc(sizeof *variable);

在这种情况下,你有两个优势,

  1. 您的语句与变量的类型是解耦的。
  2. 错误输入所需尺寸的可能性较小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多