【问题标题】:Initializing a void* buffer with calloc [duplicate]使用 calloc 初始化 void* 缓冲区
【发布时间】:2019-04-25 11:04:02
【问题描述】:

所以我阅读了calloc 的文档,它说它将初始化n 大小为size 的对象并将每个对象初始化为0。

所以在用 C 语言实现通用动态数组之前,我决定使用 int 类型来实现它,以使事情变得更简单。我曾经调用calloc,缓冲区中的每个整数都将被初始化为0,这意味着一个空白空间。但是当我将数据缓冲区从int *buffer 更改为void **buffer 时,我一直想知道这是否正确地初始化了每个指向NULL 的空指针。我已经看到 NULL 被转换为 0 如果你这样做 int a = NULL 但 void *p = 0 和 void *p = NULL 一样吗?这就是calloc 实际所做的吗?

【问题讨论】:

  • 最后,一切都只是一个数字,并按原样存储。所以此时的内存将为 0。另一件事是它是如何评估的,在这种情况下,如果你访问这个指针,你将有一个 NULL 指针。还有different implementations of NULL
  • @Yastanub 另一件事是如何评估它,在这种情况下,如果您访问此指针,您将有一个 NULL 指针。 – 不,不能保证 @ 987654339@ 与全零相同。
  • @Swordfish 是的,重复,不知道为什么我在搜索一个小时后找不到那个问题。谢谢!
  • @LeoVen 那么你真的必须努力处理你的Google-fu
  • @Swordfish 考虑到标题很蹩脚并且与我实际寻找的内容无关,我的 google-fu 能力做得很好。我只是希望我的问题能填补像this one 这样的问题无法做到的另一个空白。

标签: c arrays buffer dynamic-memory-allocation calloc


【解决方案1】:

首先,请注意:标准实际上并没有指定 NULL 指针按位等于 0,只是 NULL 不指向任何东西。然而,在大多数实现中,NULL 按位等于 0。

void *p = 0 将 p 设置为仅由 0 组成的指针。虽然在您的计算机上可能与void *p = NULL 相同,但 C 标准不保证这一点。

void **buffer = calloc(...) 会将buffer 中的每个void *p 设置为0,这可能对应于您机器上的NULL。

让我们看看calloc(3, 4),在一个整数和空指针都是4字节的机器上。 (请注意,整数和 void 指针并不总是 4 个字节;这仅用于说明目的。)calloc 在这种情况下会分配:

| 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |

并返回一个指向上述内存的指针(数字表示内存中存储的十六进制值)。

如果我们使用int *buffer = calloc(3, 4),buffer 的每 4 个字节将是一个值为 0 的整数。

如果我们使用void **buffer = calloc(3, 4),buffer 的每 4 个字节将改为指向地址 0 的 void*。在 NULL 按位为 0 的机器上,这与用 NULL 指针填充 buffer 相同.

【讨论】:

    【解决方案2】:

    NULL 保证不指向任何东西。 calloc 所做的只是在 malloc 之后将内存填零。

    “空指针在概念上与未初始化的指针不同。众所周知,空指针不指向任何对象或函数;未初始化的指针可能指向任何地方。另请参见问题 1.30、7.1 和 7.31。”

    “如上所述,每种指针类型都有一个空指针,不同类型的空指针的内部值可能不同。虽然程序员不需要知道内部值,但必须始终告知编译器是哪种类型需要空指针,以便在必要时进行区分(参见问题 5.2、5.5 和 5.6)。”

    http://c-faq.com/null/null1.html

    【讨论】:

    • 一些有趣的事情:已经看到void(*reset)(void) = NULL; reset(); 在某些微控制器上重置了软件系统(不记得是哪一个,可能是 AVR)。显然不符合标准 - 如此,NULL 需要与起始地址不同,它可能已被分配所有位 1 然后......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多