使用malloc分配0个字节

时间:2015-02-08 00:34:07

标签: c malloc dynamic-memory-allocation

因此,分配零字节是不明确的,所以我想将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;
}

4 个答案:

答案 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返回值仍然可能对您的应用程序没用。