ISO/IEC 9899:TC2(即C99标准),§7.20.3规定:
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,但返回的指针不应用于访问对象.
换句话说,malloc(0)可以返回NULL或有效指针,我可能不会取消引用.
这种行为背后的理由是什么?
并且定义malloc(0)导致UB不是更容易吗?
为什么malloc(0)返回有效的内存地址?什么用途 ?
当Valgrind报告o字节丢失时,这意味着什么,就像这里:
==27752== 0 bytes in 1 blocks are definitely lost in loss record 2 of 1,532
Run Code Online (Sandbox Code Playgroud)
我怀疑它只是一个创造性使用的神器malloc,但确定是好的( - ;
编辑:当然真正的问题是它是否可以被忽略,或者它是一个有效的泄漏,应该通过释放这些缓冲区来解决.
我试图理解双指针(这是指针持有另一个指针)的内部形成一个指针数组.所以,我试图运行以下代码,通过试验malloc进行调试,看看它是如何工作的.我无法理解malloc(0)我的情况,但我的代码通过输出"Hello World"来工作.
什么是差异
pToCharsPointers = (char**) malloc(0);
Run Code Online (Sandbox Code Playgroud)
和
pToCharsPointers = (char**) malloc(2 * sizeof(char*));
Run Code Online (Sandbox Code Playgroud)
请有人澄清一下我的情况.
#include <stdio.h>
char **pToCharsPointers;
int main(void)
{
pToCharsPointers = (char**) malloc(0);
char* pToChars = "Hello";
*pToCharsPointers = pToChars;
*(pToCharsPointers + 1)= "World";
printf("%s %s\n", *(pToCharsPointers + 0), *(pToCharsPointers + 1));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另外,如果有人能解释双指针如何与内存中的示例一起工作以进行可视化,我会非常感激,因为即使我试图在很多地方阅读此内容,我仍未能看到自己.
编辑:感谢大家分享您的答案,这真的有助于理解.当我打印它时,我得到了一个带有malloc(0)的有效指针,并且在多次尝试期间也可以解除引用它而没有问题.想了解它的工作原理.在我的情况下似乎未定义的行为实际上是预期的行为.
可能重复:
malloc(0)返回什么?
它会返回零指针吗?行为标准化了吗?
STL分配器怎么样?
我用Google搜索,但无法确定我正在寻找的答案.
编辑:链接的问题不解释STL分配器.
我有另一个相关的问题.如果试图释放零指针会发生什么?
allocator.deallocate(0, 1);
Run Code Online (Sandbox Code Playgroud) 我在c中编写一个应用程序,我正在动态分配一些数组所需的内存.我知道很多这些数组都需要零分配.那么,当我打电话给他们时会有问题吗?例如free(malloc(0 * sizeof(int)));?我知道我的应用程序在我的机器上编译并运行正常,但我可以依赖它吗?干杯!
此代码显示"unsuccesful"但如果将0替换为0则不会为NULL.我不知道如何分配0个内存空间.我知道没有用但是不是NULL == 0L所以它也应该是== 0 ..
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr;
if((ptr = malloc(-1)) == NULL)
printf("unsuccessful: no memory space was allocated.\n");
else{
printf("successful: memoryspace was allocated. \n");
free(ptr);
}
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)