这是我的代码。
#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
我不知道为什么每次运行这个程序时,第一个数字总是一个奇怪的整数。
任何人都可以帮助我,我想知道这个问题是什么。
(我忘了上传我的代码的排序部分。)
非常感谢。
答案 0 :(得分:3)
代码的行为是未定义。
A0[j - 1]
至少有一次在数组范围之外。
此外,停止条件的打印循环需要count0 < b0
而不是count0 <= b0
。
其他一切看起来都不错。
答案 1 :(得分:2)
来自A0
的第一个整数不能奇怪,但最后一个可能是,因为你正在读取超出范围的数据 - 循环中的条件应为for (int count0 = 0; count0 < b0; count0 ++)
。
答案 2 :(得分:1)
当我对malloc
和free
数组使用A0
和y
时,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==1
:A0[0]
b0==2
:A0[0]
,A0[1]
b0==3
:A0[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
数组访问权限的所有问题。