问题陈述: 给定一个整数序列。对于每组 5 个连续元素 (1..5、6..10 等)找到最小值并将其放入另一个数组中( 长度是初始数组的 1/5)。 使用一个函数来获取指向 5 个元素的序列的指针和一个 指向将存储结果的整数的指针。
void main()
{
int n1,i,z,k;
int v[50],x[10];
printf("length of array:");
scanf("%d" , &n1);
k = -1;
readArray ( n1, v );
for (i=0; i<=n1; i++)
{
searchArray ( &k, &v[i], &x[k] );
}
writeArray ( k , x );
}
v[i] 是初始数组,x[k] 是结果数组,k 点是结果应该放在 x 中的位置。
void searchArray ( int *k, int * v, int * x)
{
int i,z;
bool dif;
dif = false;
z = z+1;
if (v[i-1] == (v[i]-1))
{
dif = true;
if ((dif == true) && (z == 4))
{
*k = *k+1;
x[*k] = v[i-4];
z = 0;
if (v[i]+1 == v[i+1])
{
i = i+1;
}
}
}
else if ( dif != true )
{
z = 0;
}
}
问题:对于从 1 到 10 的数组,结果是 x[0] = 134513473 x[1] = 6,如果我查看 x[-1] 是 1。所以不要将 1 放入 x[0 ] 它将它放入 x[-1] 中,x[0] 返回内存地址。
最佳答案
一个问题是线路:
z = z+1;
您尚未将 z
初始化为任何内容,因此此后使用 z
的所有内容都在使用垃圾。您的下一行是:
if (v[i-1] == (v[i]-1))
由于 i
未初始化,因此您再次处理垃圾。这可不是什么令人高兴的事态。
如果您设计正确,您的函数不需要 k
作为参数。不过,您需要修改调用以传递数组中的正确偏移量。 (目前,您正在扫描 0..4、1..5、2..6,而不是 0..4、5..9、10..14。)
关于c - 数组分配不需要的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9878669/