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()的调用放在何处?