Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用malloc分配0字节_C_Malloc_Dynamic Memory Allocation - Fatal编程技术网

使用malloc分配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

因此,分配零字节的定义不正确,因此我想将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;
}
否-根据,非空返回值可能仍然对您的应用程序无效。

否-根据,非空返回值可能仍然对您的应用程序无效

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

参考:

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

参考:

链接到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。实际上,代码中缺少了一些东西,当我发布代码时,解引用操作符星被删除了。我不知道为什么会发生这种情况。请访问下面的链接,并解释为什么运行良好,没有任何错误@阿披舍克贾伊斯瓦尔