在调试时获得错误“算术异常”

时间:2013-09-18 19:57:24

标签: c debugging runtime-error

在回答this问题时,我尝试运行此代码(用于生成给定范围内的随机数);

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

int main()
{

    int max_range, i = 0, rand_num;
    bool digit_seen[max_range + 1]; // VLAs For C99 only 

    srand((unsigned)time(NULL));
    printf("Enter your maximum of range: ");
    scanf("%d", &max_range);

    for (int i = 1; i <= max_range; i++)
        digit_seen[i] = false;  

    for (;;)
    {  
         rand_num = rand() % max_range + 1;
         if(rand_num !=3)
             if(!digit_seen[rand_num])
             {
                printf("%d ", rand_num);
                digit_seen[rand_num] = true;
                i++;
             }
         if( i == (max_range - 1) )
             exit(0);
    }    
    return 0;
}

它工作正常max_range 47但之后我在调试时遇到此错误

enter image description here

我知道为什么会这样吗?

2 个答案:

答案 0 :(得分:5)

您正在根据未初始化的max_range

值创建数组
bool digit_seen[max_range + 1]; // VLAs For C99 only 

可以想象任何尺寸。为什么它适用于某些值并且不适用于其他值是未定义行为的魔力的一部分;任何事情都可能发生。

答案 1 :(得分:4)

当您声明bool digit_seen[max_range + 1];时,max_range的值尚未定义。所以digit_seen分配了一定数量的空间。

您可以这样做(使用现有代码,并假设符合C99的编译器):

int main()
{
    int max_range, i = 0, rand_num;

    srand((unsigned)time(NULL));
    printf("Enter your maximum of range: ");
    scanf("%d", &max_range);

    if (max_range <= 0) {
        // probably want to scold the user here and exit
    }

    bool digit_seen[max_range + 1]; // VLAs For C99 only 
    ...

或者,您可以使用动态内存分配:

int main()
{
    int max_range, i = 0, rand_num;
    bool *digit_seen;

    srand((unsigned)time(NULL));
    printf("Enter your maximum of range: ");
    scanf("%d", &max_range);

    if (max_range <= 0) {
        // probably want to scold the user here and exit
    }

    digit_seen = malloc(max_range+1); 
    ...

    // use *digit_seen or digit_seen[i], where i >= 0 and <= max_range

    ...
    free(digit_seen);