随机数问题(C)

时间:2017-11-24 11:44:06

标签: c random

这是我的代码。

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

int main()
{
    int i;
    int j;
    int x;
    int y[100];
    int b0 = 0, A0[100];

    srand(time(NULL));

    for (x = 0; x < 100; x ++)
    {
        y[x] = (rand()% 1000)+ 1;
    }
    int ans;

    for (x = 0; x < 100; x ++)
    {
        ans = y[x] % 10;

        if(x == 0)
        {
            printf("Frist group(Last for'0')\n");
        }
        if (ans == 0)
        {
            A0[b0] = y[x];
            b0++;
        }
    }

for (i = 0; i < b0; i ++)
{
    for (j = b0; j > i; j --)
    {
        if (A0[j - 1] > A0[j])
        {
            A0[j - 1] = A0[j - 1] ^ A0[j];
            A0[j] = A0[j - 1] ^ A0[j];
            A0[j - 1] = A0[j - 1] ^ A0[j];
        }
    }
}

    for (int count0 = 0; count0 <= b0; count0 ++)
    {
        printf(" %d  ", A0[count0]);
    }
    printf("\n\n");

    system("pause");
    return (0);
}

这是我的输出。

Frist group(Last for'0')
 32766   1000   840   630   900   500   830   520   80   470   510   760

我不知道为什么每次运行这个程序时,第一个数字总是一个奇怪的整数。

任何人都可以帮助我,我想知道这个问题是什么。

(我忘了上传我的代码的排序部分。)

非常感谢。

3 个答案:

答案 0 :(得分:3)

代码的行为是未定义

A0[j - 1]至少有一次在数组范围之外。

此外,停止条件的打印循环需要count0 < b0而不是count0 <= b0

其他一切看起来都不错。

答案 1 :(得分:2)

来自A0的第一个整数不能奇怪,但最后一个可能是,因为你正在读取超出范围的数据 - 循环中的条件应为for (int count0 = 0; count0 < b0; count0 ++)

答案 2 :(得分:1)

当我对mallocfree数组使用A0y时,Linux上的valgrind提供以下输出:

Frist group(Last for'0')
==9169== Conditional jump or move depends on uninitialised value(s)
==9169==    at 0x108972: main (foobar.c:40)
==9169== 
==9169== Conditional jump or move depends on uninitialised value(s)
==9169==    at 0x4E8737A: vfprintf (in /usr/lib/libc-2.26.so)
==9169==    by 0x4E8EAA5: printf (in /usr/lib/libc-2.26.so)
==9169==    by 0x108A24: main (foobar.c:51)
==9169== 
==9169== Use of uninitialised value of size 8
==9169==    at 0x4E8329B: _itoa_word (in /usr/lib/libc-2.26.so)
==9169==    by 0x4E86A0F: vfprintf (in /usr/lib/libc-2.26.so)
==9169==    by 0x4E8EAA5: printf (in /usr/lib/libc-2.26.so)
==9169==    by 0x108A24: main (foobar.c:51)

注意每个部分的最后一行:在第40行的main函数内,有一个&#34;未初始化的值&#34;。这意味着您的程序正在尝试从您从未存储/写入值的地址读取值。这是if (A0[j - 1] > A0[j])行。由于它是一个数组访问,问题在于循环中使用的值j

您在写信b0++后输入了A0[b0],因此b0如果A0[0]为{0},那么b0++会将其设为1.换句话说,你有:

  • b0==1A0[0]
  • b0==2A0[0]A0[1]
  • b0==3A0[0]A0[1]A0[2]
  • ...

这意味着当完成向b0 - 1分配值的第一个循环时,您只会将值从0写入A0。因此,j = b0表示您正在使用A0[b0],它没有写入任何值。您在A0[b0 - 1]处交换了一个您在A0[b0]未分配的未知号码的随机数。因为您从未分配过,A0[b0]是&#34;未初始化&#34;。

在您的打印循环中,b0出现count0 <= b0同样的问题,这就是为什么第51行也会出现问题。将其更改为count0 < b0,并解决A0数组访问权限的所有问题。