【问题标题】:Why is this C program crashing?为什么这个 C 程序会崩溃?
【发布时间】:2012-05-24 21:35:51
【问题描述】:

我有一个用 C 语言编写的简单测试程序来打乱堆上的一组值。旁注:我知道这里的随机逻辑有一个缺陷,不允许“位移”值超过RAND_MAX,但这不是本文的重点。

关键是当我运行 N = 10000 的代码时,每隔一段时间它就会崩溃,而且信息很少(下面发布的屏幕截图)。我正在使用 MinGW 编译器。我似乎无法重现更低或更高 N 值(例如 1000 或 100000)的崩溃。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

const int N = 10000;

int main() {
    int i, rand1, rand2, temp, *values;

    /* allocate values on heap and initialize */
    values = malloc(N * sizeof(int));
    for (i = 0; i < N; i++) {
        values[i] = i + 1;
    }

    /* scramble */
    srand(time(NULL));
    for (i = 0; i < N/10; i++) {
        rand1 = (int)(N*((double)rand()/(double)RAND_MAX));
        rand2 = (int)(N*((double)rand()/(double)RAND_MAX));
        temp = values[rand1];
        values[rand1] = values[rand2];
        values[rand2] = temp;
    }


    int displaced = 0;
    for (i = 0; i < N; i++) {
        if (values[i] != (i+1)) {
            displaced++;
        }
    }
    printf("%d numbers out of order\n", displaced);

    free(values);
    return 0;
}

【问题讨论】:

    标签: c crash


    【解决方案1】:

    可能是因为rand()产生了一个0到RAND_MAX之间的随机数所以(int)(N*((double)rand()/(double)RAND_MAX))可以是N,超出了数组边界。但是,我不明白为什么这会随着数组大小而变化(它确实解释了为什么它有时只会崩溃)。

    尝试/(1+(double)RAND_MAX)(请注意,加法是双精度数,以避免溢出,具体取决于 RAND_MAX 的值)(尽管我不相信这将始终有效,具体取决于所涉及的类型。这样会更安全测试 N 并重试)。

    另外,学习使用来自Is there a good Valgrind substitute for Windows? 的工具 - 他们使这种事情很容易修复(他们会在您运行程序时准确地告诉您出了什么问题)。

    【讨论】:

    • D'oh,这应该很明显。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2023-03-11
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多