因此,分配零字节是不明确的,所以我想将0字节视为失败。这段代码会不会这样做?
#include <stdio.h>
#incude "xmalloc.h"
void *malloc_or exit(size_t nbytes, const char *file, int line){
void *x; //declarea void pointer
if ((x = malloc(nbytes)) == NULL){
fprintf(stderr. " %s: line %d: malloc(%zu) bytes failed", file , line, nbytes);
exit(EXIT_FAILURE);
} else
return x;
}
答案 0 :(得分:4)
C standard(指向N1570草案的链接)说:
如果请求的空间大小为零,则行为为 implementation-defined:返回空指针,或者 行为就像大小是一些非零值,除了 返回的指针不得用于访问对象。
因此,如果使用malloc_or_exit()
参数调用0
函数,它可能会终止您的程序(如果malloc(0)
返回NULL
),或者它可能会返回可能未解除引用的非空指针(取消引用此类指针会导致未定义的行为)。
如果要将零大小的分配视为错误,可以修改包装函数(未经测试):
void *malloc_or_exit(size_t size) {
void *result;
if (size == 0) {
exit(EXIT_FAILURE);
}
else if ((result = malloc(size)) == NULL) {
exit(EXIT_FAILURE);
}
else {
return result;
}
}
答案 1 :(得分:1)
如果size为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。
REF:malloc
答案 2 :(得分:1)
int i = 4;
void *x;
if( ( i != 0 ) && ( ( x = malloc(i) ) != NULL ) )
{
// malloc successfull
}
else
{
// not successfull
}
return 0;
答案 3 :(得分:0)
否 - 根据whats-the-point-in-malloc0,非null返回值仍然可能对您的应用程序没用。