在回答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
但之后我在调试时遇到此错误
我知道为什么会这样吗?
答案 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);