使用malloc分配0字节
因此,分配零字节的定义不正确,因此我想将0字节视为失败。这段代码会起作用吗使用malloc分配0字节,c,malloc,dynamic-memory-allocation,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: mal
#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;
}
否-根据,非空返回值可能仍然对您的应用程序无效。否-根据,非空返回值可能仍然对您的应用程序无效
如果大小为零,则返回值取决于特定的库实现。它可能是空指针,也可能不是空指针,但返回的指针不应被解引用
参考:
如果大小为零,则返回值取决于特定的库实现。它可能是空指针,也可能不是空指针,但返回的指针不应被解引用
参考:链接到N1570草案的链接显示:
如果请求的空间大小为零,则行为为
实现定义:返回空指针,或
行为就像大小是一些非零值,除了
返回的指针不得用于访问对象
因此,如果调用malloc_或_exit函数时参数为0,则如果malloc0返回NULL,它可能会终止程序,或者它可能会返回一个非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;
}
}
N1570草案的链接如下:
如果请求的空间大小为零,则行为为
实现定义:返回空指针,或
行为就像大小是一些非零值,除了
返回的指针不得用于访问对象
因此,如果调用malloc_或_exit函数时参数为0,则如果malloc0返回NULL,它可能会终止程序,或者它可能会返回一个非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;
}
}
实际上,malloc返回0并没有定义错误;它被明确定义为发生错误时的返回值。分配零字节可能会给您一个有效指针,您可以将其传递给free或NULL,这是实现定义的。请参阅,例如…@JoachimPileborg NULL也是一个有效的指针,您可以将其传递给free@昆汀吹毛求疵;void*x//declareavoid指针——注释实际上不是这样工作的,malloc返回0并没有定义错误;它被明确定义为发生错误时的返回值。分配零字节可能会给您一个有效指针,您可以将其传递给free或NULL,这是实现定义的。请参阅,例如…@JoachimPileborg NULL也是一个有效的指针,您可以将其传递给free@昆汀吹毛求疵;void*x//declarea void pointer-注释不是这样工作的,因为它可能对OP没有帮助,OP可能没有意识到它来自C标准。本质上,它说程序不应该尝试使用返回值作为指针,因为它不能保证是有效的或有用的。这可能对OP没有帮助,OP可能没有意识到它来自C标准。本质上,它说程序不应该尝试使用返回值作为指针,因为它不能保证有效或有用我尝试了这段代码,没有发现任何错误,这可能是由于取消引用大小为0的malloc返回的指针作为参数造成的。@AbhishekJaiswal您的代码有未定义的行为。如果它没有显示一个可见的错误,那就意味着你有一个很难检测到的bug。实际上,代码中缺少了一些东西,当我发布代码时,解引用操作符星被删除了。我不知道为什么会发生这种情况。请访问下面的链接,并解释为什么运行良好,没有任何错误@AbhishekJaiswal Hey include int main{int p=intmalloc0;p[0]=3;printf%d,*p;return 0;}我尝试了这段代码,没有发现任何错误,可能是因为取消引用大小为0的malloc返回的指针作为参数。@AbhishekJaiswal您的代码有未定义的行为。如果它没有显示一个可见的错误,那就意味着你有一个很难检测到的bug。实际上,代码中缺少了一些东西,当我发布代码时,解引用操作符星被删除了。我不知道为什么会发生这种情况。请访问下面的链接,并解释为什么运行良好,没有任何错误@阿披舍克贾伊斯瓦尔