-3

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

#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_range47但之后我在调试时遇到了这个错误

在此处输入图像描述

知道为什么我会得到这个吗?

4

2 回答 2

5

您正在根据 的未初始化值创建一个数组max_range

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

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

于 2013-09-18T20:00:12.643 回答
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);
于 2013-09-18T20:00:48.013 回答