2015-02-08 35 views
0

因此,分配零字节是不明确的,所以我想把0字节视为失败。请问这代码做的伎俩使用malloc分配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

实际上,对于'malloc'返回0不虐待定义;它明确定义为错误情况下的返回值。 – 2015-02-08 00:37:29

+0

分配零字节可能会给你一个有效的指针(你可以传递给'free')或'NULL',它是实现定义的。见例如[这个'malloc'参考](http://en.cppreference.com/w/c/memory/malloc)。 – 2015-02-08 00:38:28

+1

@JoachimPileborg'NULL'也是一个有效的指针,你可以传递给'free()';) – Quentin 2015-02-08 00:51:30

回答

4

C standard(该链接到N1570草案)说:

如果空间的请求的大小为零,则该行为 实现定义:要么返回一个空指针,要么 的行为就好像该大小是非零值一样,除了 返回的指针不应该用于访问对象。

因此,如果您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

如果大小为零,则返回值取决于特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解除引用。

裁判:malloc

+0

这个“应该”对OP来说可能没有帮助,OP可能没有意识到它来自C标准。基本上它说程序不应该尝试使用返回值作为指针,因为它不能保证是有效的(或有用的)。 – 2015-02-14 13:27:17

1
int i = 4; 
void *x; 
if((i != 0) && ((x = malloc(i)) != NULL)) 
{ 
    // malloc successfull 
} 
else 
{ 
    // not successfull 
} 
return 0; 
相关问题