所以分配零字节定义不正确,所以我想将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;
}
C标准(链接到N1570草案)说:
如果请求的空间大小为零,则行为为实现定义:返回一个空指针,或者行为就像大小是某个非零值,除了返回的指针不应用于访问对象。
因此,如果使用参数0
调用malloc_or_exit()
函数,它可能会终止程序(如果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;
}
}
如果大小为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被取消引用。
ref:malloc
int i = 4;
void *x;
if( ( i != 0 ) && ( ( x = malloc(i) ) != NULL ) )
{
// malloc successfull
}
else
{
// not successfull
}
return 0;
否-根据whats-the-point-in-malloc0,非null返回值可能对您的应用程序仍然没有用处。