数组被破坏

时间:2021-04-20 04:40:03

标签: c

当我运行这个程序时,我想要一个 0 和 1 的列表,但我得到的是一个 0、1 和一堆正负随机数的列表。我做错了什么?

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

int randomInt(maxNum) {
  return (rand() % maxNum - 1) + 1;
}

int main(void) {
  srand(time(NULL));
  int board[100];
  int index = 1;
  for (int i = 0; i < 20; i ++) {
    board[randomInt(100)] = 1;
  }
  for (int i = 0; i < 100; i ++) {
    printf("%i\n", board[index]);
    index ++;
  }
}

2 个答案:

答案 0 :(得分:4)

您没有初始化 board,因此它在每个单元格中都有不确定的值,但您分配给 1 的 20 个(或更少)。用零显式初始化它:

 int board[100] = {0};

避免将堆栈上的随机垃圾视为初始值。我还建议打开编译器警告(它应该识别初始化失败,尽管在这种情况下伪随机部分初始化可能会欺骗它)。

答案 1 :(得分:0)

C Operator Precedence
- 运算符的优先级高于 % 运算符,因此减法将在模运算之前执行。因此,对 randomInt() 的调用返回 1...99 范围内的值,这是可以的。

通过启用警告的编译器运行发布的代码:

gcc -ggdb3 -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" -o "untitled2.o" 

结果:

untitled2.c: In function ‘randomInt’:

untitled2.c:5:5: warning: type of ‘maxNum’ defaults to ‘int’ [-Wimplicit-int]
    5 | int randomInt(maxNum) {
      |     ^~~~~~~~~

untitled2.c: In function ‘main’:

untitled2.c:10:9: warning: conversion from ‘time_t’ {aka ‘long int’} to ‘unsigned int’ may change value [-Wconversion]
   10 |   srand(time(NULL));
      |         ^~~~~~~~~~

在编译时,始终启用警告,然后修复这些警告。

正如其他人评论的那样,将 board[] 初始化为已知值,例如 0

您可以通过以下方式更正 randomInt() 的签名:

int randomInt( int maxNum) {

您可以通过以下方式消除关于 conversion to unsigned 的警告:

srand( (unsigned) time(NULL));

关于:

for (int i = 0; i < 100; i ++) {
    printf("%i\n", board[index]);
    index ++;
}

这可以简化,因此它不会通过以下方式引入另一个变量:

for ( index = 0; index < 100; index++ ) 
{
    printf( "%i\n", board[index] );
}