不确定,根据我找到的一些随机malloc源代码,输入0会导致返回值为NULL。所以这是将艺术家指针设置为NULL的疯狂方式。
http://www.raspberryginger.com/jbailey/minix/html/lib_2ansi_2malloc_8c-source.html
实际上,这是非常有用的,而且(显然是我个人意见),返回空指针的允许行为是错误的。动态指针不仅对它所指向的内容有用,而且其地址也是唯一的。返回NULL会移除这第二个属性。我经常编写的所有嵌入式malloc都具有此行为。
malloc(1)
呢?这将返回一个唯一的地址(至少在分配对象的生命周期内是唯一的)。 - wovano运行了valgrind内存检测工具后,这里是分析结果。
==16740== Command: ./malloc0
==16740==
p1 = 0x5204040
==16740==
==16740== HEAP SUMMARY:
==16740== in use at exit: 0 bytes in 0 blocks
==16740== total heap usage: 2 allocs, 2 frees, 1,024 bytes allocated
==16740==
==16740== All heap blocks were freed -- no leaks are possible
这是我的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
//int i;
char *p1;
p1 = (char *)malloc(0);
printf("p1 = %p\n", p1);
free(p1);
return 0;
}
默认情况下分配了1024字节。如果我增加malloc的大小,分配的字节数将增加1025等等。
使用malloc(0)会返回NULL或一个有效的指针,可以正确地传递给free。虽然它似乎指向的内存是无用的,或者不能被写入或读取,但这并不总是正确的。 :)
int *i = malloc(0);
*i = 100;
printf("%d", *i);
我们预计会在这里出现分段错误,但令人惊讶的是,它打印了100!这是因为当我们第一次调用malloc时,malloc实际上请求了一个巨大的内存块。之后每次调用malloc都使用来自该大块的内存。只有在那个巨大的块用完之后,才会请求新的内存。
使用malloc(0):如果您处于希望后续malloc调用更快的情况下,请调用malloc(0)(除了边缘情况外)。
*i
可能不会导致崩溃,但这仍然是未定义行为。小心鼻子恶魔! - John Dvorakmalloc(0)
有一个没有被提到的用途。在那些返回非NULL值的实现中,特别是在DEBUG版本中,它可能会分配比您请求的更多的内存,并给您指向其内部标头之后的指针。如果您在一系列分配之前和之后获取此指针,则可以获得实际内存使用情况的感觉。例如:void* before = malloc(0); ... void* after = malloc(0); long long total = after - before;
或类似的操作。 - Jesse Chisholmmalloc(0)
。您能告诉我是哪一章吗?如果能提供确切的引用就更好了。 - Андрей Беньковский仅纠正这里的错误印象:
artist = (char *) malloc(0);
永远不会返回 NULL
;它与 artist = NULL;
不同。编写一个简单的程序并将 artist
与 NULL
进行比较。if (artist == NULL)
是假的,而 if (artist)
是真的。
char *ptr;
if( (ptr = (char *) malloc(0)) == NULL )
puts("Got a null pointer");
else
puts("Got a valid pointer");
ptr
不为空。malloc(0)
会返回一个有效的内存地址,其范围取决于被分配内存的指针类型。您可以将值分配给内存区域,但这应该与使用的指针类型相符。您也可以释放已分配的内存。我将用一个例子来解释:
int *p=NULL;
p=(int *)malloc(0);
free(p);
gcc
编译器中可以正常工作。如果您有一个32位编译器,那么您可以提供整数范围内的值,即-2147483648到2147483647。字符也是如此。请注意,如果声明的指针类型更改,则值的范围将发生变化,而不管malloc
类型转换如何。unsigned char *p=NULL;
p =(char *)malloc(0);
free(p);
p
将会取一个从0到255的char值,因为它被声明为无符号整数。
malloc()
并不知道类型转换(在C中实际上是完全多余的)。对malloc(0)
返回值进行解引用会导致未定义的行为。 - cmaster - reinstate monica