【问题标题】:Why I never see the Hello text in Console in this program?为什么我在这个程序的控制台中从来没有看到 Hello 文本?
【发布时间】:2015-06-19 05:25:34
【问题描述】:

这是我的代码,在 OS X Yosemite

上运行
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,它会在什么时候返回呢?我的理解是这里发生了内存分配问题,但是为什么没有打印“Hello”呢?

【问题讨论】:

  • printf() 被缓冲;并非所有输出都会立即写入。在printf() 调用之后,您立即尝试将大量数据写入NULL - 我想程序在没有尝试刷新输出的情况下崩溃。
  • @PaulRoub 让我试试。
  • 你不应该在查看之后再次调用 memset,并在 printf 之后的 if 语句中放置一个“break”。
  • @OldProgrammer 为什么不这样做,为什么?
  • 当你使用它时......你没有使用 rand() 做任何事情,但在你这样做之前,将 srand() 放在循环之外。

标签: c malloc osx-yosemite memset


【解决方案1】:

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

【讨论】:

  • 你在哪里调用了 fflush()?
【解决方案2】:

如果你的内存需求超过了可用内存,Linux 将终止程序,使 malloc 永远不会返回 NULL。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2017-06-13
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多