Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/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
C 为什么我从未在这个程序的控制台中看到Hello文本?_C_Malloc_Osx Yosemite_Memset - Fatal编程技术网

C 为什么我从未在这个程序的控制台中看到Hello文本?

C 为什么我从未在这个程序的控制台中看到Hello文本?,c,malloc,osx-yosemite,memset,C,Malloc,Osx Yosemite,Memset,这是我在优胜美地操作系统上运行的代码 int main(int argc, char *argv[]){ while (1) { srand(time(NULL)); int r = rand(); printf("Allocating\n"); int *pi = malloc(5000000 * sizeof(int)); if(pi==NULL){ printf("Hello")

这是我在优胜美地操作系统上运行的代码

int main(int argc, char *argv[]){
    while (1) {
        srand(time(NULL));
        int r = rand();
        printf("Allocating\n");
        int *pi = malloc(5000000 * sizeof(int));
        if(pi==NULL){
            printf("Hello");
        }
        memset(pi, r, 5000000 * sizeof(int));
    }
}
所以这个程序最终停止运行,我看到控制台中的最后几行是:

分配

分配

分配

死亡人数:9人

Korays MacBook Pro:hello2 koraytugay$


如果malloc在这种情况下不返回NULL,它什么时候会返回NULL?我的理解是这里发生了内存分配问题,但为什么不打印“Hello”?

我怀疑printf会将“Hello”列为输出队列,然后您尝试使用空指针进行memset,并在处理排队的“Hello”之前终止进程。您可以尝试在Hello(fflush)之后刷新stdout。

如果您的内存需求超过可用内存,Linux将终止该程序,从而使malloc永远不会返回NULL


您可以使用echo 2>/proc/sys/vm/overmit_内存关闭此功能。

printf()
已缓冲;并非所有输出都是立即写入的。调用
printf()
后,您立即尝试将大量数据写入
NULL
——我想象程序在没有刷新输出的情况下崩溃。@PaulRoub让我试试。您不应该在查看后再次调用memset,并设置“中断”在printf后面的if语句中。@OldProgrammer Why not and Why?当您使用时……您没有使用rand()进行任何操作,但在使用之前,请将srand()带到循环之外。您将对fflush()的调用放在何处?