【问题标题】:Infinite loops in C [closed]C中的无限循环[关闭]
【发布时间】:2016-07-12 11:27:27
【问题描述】:

我很确定这段代码给了我一个无限循环,(我已经离开了很长时间,但什么也没发生),我已经主演了 2 天了,但我没有不知道为什么它一直在循环。有什么想法吗?

    int r = 0;
    int H = 0;
    int g = 0;

    while (r < (3265920)) {

        while (g < 79338) {
            //printf("middle");
            if (!strcmp(arr1[g], Arr2[r])) {

            strcpy(out[H], arr1[g]);
            H++;
        }
            g++;
        }

    r++;
    g = 0;
}

Q=0;
while (Q < 79338) {


    printf("%d: %s\n",Q, Ans[Q]);
    Q++;

}

所有数组在主数组之外都有正确的内存分配。

static char arr2[NINE_FACT * 9][10];
char Ans[79339][10];
char arr1[79339][45];

【问题讨论】:

  • 正确缩进。并使用不言自明的名称。你有 3 个循环。你是指哪一个?调试说明了什么?你试过自己找出什么(除了盯着它看)。
  • @J.doo 这个神奇的数字 3265920 是什么意思,为什么要在数组之外使用索引?
  • @J.doo arr2 和 Arr2 是什么?
  • 简历为“不清楚”。充满魔幻数字和缺失的声明:(
  • 从技术上讲,您的代码可以在仅支持 16 位 int(C 标准允许的最小大小)的机器上无限循环。但是,有符号整数的溢出无论如何都是未定义的。

标签: c multidimensional-array infinite-loop strcmp strcpy


【解决方案1】:

您的内部循环运行了 259111560960 次,这可能需要很长时间。 H 是做什么用的?在 32 位机器上,H 可能会导致错误,因为它会溢出。请注意,您所在机器的字长很重要,即这段代码在您的机器上会产生什么?

printf("sizeof(int) == %zu\n", sizeof(int));

我很惊讶它可以正常运行。

out[H]; //This array could be huge.

如果这是一个普通数组并且您使用的是 64 位机器,我预计会出现分段错误,或者这有时可能需要一些时间进行核心转储。

假设一个 32 位机器和单个字符作为字符串 out[H] 将需要 2^31 个字节 * 2 由于空终止符,即刚刚超过 4 Gb 的 RAM?

【讨论】:

  • int类型能处理这样的值吗?
  • 取决于机器@Joel
  • r 和 g 在溢出之前都在进行测试。关键是您正在运行 strcmp 和 strcpy 近 260 亿次。我不知道“H”是用来做什么的,但如果你在 32 位机器上它会溢出。
  • H 仅在两个数组相同时递增,因此不会在每个时间都添加。
  • 它正在检查所有可能的排列,(包括所有长度)随机 9 个字母字符串与所有单词的匹配次数不会超过 80,000 次
【解决方案2】:

r 的值永远不会是 3265920,如果它是 2 字节的内存分配

要么更改r to long 的数据类型,要么更改r 的条件,使其在int 的范围内

首先你分析int的范围

【讨论】:

    猜你喜欢
    • 2013-12-09
    • 2014-01-28
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多