gpt4 book ai didi

c - 零大小的 memblocks 有什么用?

转载 作者:太空狗 更新时间:2023-10-29 15:36:01 25 4
gpt4 key购买 nike

由于我在最后几天/几周发现我的大部分代码确实违反了 c99 规则,导致未定义行为的原因,我开始明确阅读 ISO/IEC 9899:TC3 草案文件。特别是附录“J.2 未定义的行为”大多数对我来说是合乎逻辑的,为什么编译违反这些规则的代码会很困难,或者在某些情况下我至少可以想“好吧,我不明白,这有什么问题,但我应该'那样做'但有一点……

"A non-null pointer returned by a call to the calloc, malloc, or realloc function with a zero requested size is used to access an object (7.20.3)."

(对于所有没有阅读过 ISO/IEC 9899:TC3“J.2 未定义行为”的人,本节仅解释哪些情况会遇到未定义行为)。

关于那个案子,我脑子里有很多问题。

首先:

为什么我要分配一个零大小的内存块?

当我得到这样一个 block 时,我可以用它做什么?

为了避免未定义的行为,可能我不想访问它指向的内存......

所以我做了更多的研究……寻找一些不同的 malloc() 手册页。并在 Linux malloc(3) man 中发现:

"If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free()."

嗯,这对我的唯一帮助是:我现在有更多的问题要问你和我自己。在相同条件下使用相同参数调用函数可能会返回不同结果的情况并不难想象,好吧......但这些不同的结果大多不必被视为不同。这就是我的建议,指向请求的零大小块的非空指针可能只是一个不需要的副作用。这是不是意味着

if ((void *ptr = malloc (0)) == NULL)
{
/*...*/
}

这还不够吗?我必须像这样处理 *alloc 调用吗?

if (X <= 0)
{
if ((*ptr = malloc (X)) != NULL)
{
exit (*);
}
else
{
/*...*/
}
}
else
{
if ((*ptr = malloc (X)) == NULL)
{
/*...*/
}
}

但即使是预料之中的,得到这样一个

"unique pointer value that can later be successfully passed to free()"

, 如何使用它? 我可以改变它周围好... 我什至可以释放它(顺便说一句,这是否意味着我必须释放它,因为我也应该对所有其他分配的内存执行此操作,或者它只是一个>你被允许,不要破坏你的代码流

像这样制作任何指针会有什么不同?

void *X = (void *)"1234abc";

我希望任何人都可以在科学哲学方面帮助我,或者像我一样对它感兴趣。

最佳答案

C 不支持零大小的对象,但是 malloc() 的参数是 size_t 类型,并且没有好的方法来阻止程序调用 malloc(0)。这可能不是程序员的本意,但也不一定是字面上的malloc(0);它更有可能是 malloc(count),其中 count 是一些计算的结果。

至于允许两种不同行为的标准,那只是因为现有的实现(在编写原始标准时)做了不同的事情,并且作者希望避免破坏现有代码。这样的代码可以说已经被破坏了,或者至少是不可移植的,但是通过允许任何一种行为,一个对 malloc(0) 的行为做出假设的程序可以继续在系统上运行 是这样写的

如果您正在寻找连贯的解释,您将找不到。如果今天从头开始设计 C,malloc(0) 的行为几乎肯定会以某种方式确定下来。要么,要么行为未定义,但使其实现定义意味着代码不必非常仔细地检查它没有将零传递给 malloc()

事实上,委员会的决定记录在 C99 Rationale 中。 ,第 7.20.3 节,第 160-161 页。

这意味着:

void *ptr = malloc(0);
free(ptr);

将正常工作; free() 如果它的参数是空指针则什么也不做。

您可以用 malloc(0) 的结果做什么?那么,如果 malloc(1024) 成功,您可以在分配的空间中存储 1024 个字节。您可以在 malloc(0) 分配的空间中存储 no 个字节——这正是您所要求的。

关于c - 零大小的 memblocks 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18132176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com