这是main调用的代码,用于使用C语言中的选择排序对数组进行排序。我在main中打开了一个文件,将前十个int放入一个数组中,将第11个放入一个变量中,然后调用一堆简单的函数。整件事重复三次。对于我的测试文件,最后两次迭代具有正确的打印排序,但第一次以0开头,但我的数组中没有0。它也会删除最后一个int。
提前感谢您的帮助!!
这是我的代码:
void sortme (int arry [], int last_int)
{
int temp;
int smallest_int;
int current_int;
int target_searcher;
int numPrinted;
for(current_int = 0; current_int < last_int; current_int++)
{
smallest_int = current_int;
for(target_searcher = current_int + 1; target_searcher <= last_int; target_searcher++)
if(arry[target_searcher] < arry[smallest_int])
smallest_int = target_searcher;
temp = arry[current_int];
arry[current_int] = arry[smallest_int];
arry[smallest_int] = temp;
} //end outter loop
numPrinted = 0;
printf("\nThe sorted array is: ");
for(current_int = 0; current_int < SIZE; current_int++)
{
printf("%4d", arry[current_int]);
if(numPrinted < COUNT)
numPrinted++;
else
{
printf("\n");
numPrinted = 0;
}
}
printf("\n");
return;
}
这是我的输出供参考(大部分内容都是在main.c中记录的):
The file opened.
Scanned into a[] and target is 33
ARRAY[1]
The contents in the array are: 40 32 57 27 67 6 3 89 2 99
The sorted array is: 0 2 3 6 27 32 40 57 67 89
The value searched, 33, was not found.
Scanned into a[] and target is 3
ARRAY[2]
The contents in the array are: 86 43 89 32 45 12 1 58 98 4
The sorted array is: 1 4 12 32 43 45 58 86 89 98
The value searched, 3, was not found.
Scanned into a[] and target is 11
ARRAY[3]
The contents in the array are: 1 2 3 4 5 6 7 8 9 10
The sorted array is: 1 2 3 4 5 6 7 8 9 10
The value searched, 11, was not found.
Closing the file.
The file closed.
答案 0 :(得分:1)
您在搜索最小值时允许target_searcher
等于last_int
。因此,有时你会得到一个随机的小值注入你的数组(并且内存不属于你)。当然,我假设last_int
是数组的长度。
当您处理“仅有效索引”时,范围从0
到len-1
。您可以看到长度为1的数组(如果您再次怀疑)。由于只有1个元素,因此它位于array[0]
或array[len-1]
。
话虽如此,通常习惯将参数作为数组和长度传递,而不是传递最后一个有效元素的数组和索引。这更自然。比如,你有一个包含两个len1
和len2
块的大型数组,以及一个对这些分区执行某些操作的函数。如果使用length作为参数,则使用:
processBlock(arr, len1);
processBlock(arr + len1, len2);
如果您要使用上一个有效索引,则必须处理所有这些+/-1
个术语。所以它是:
processBlockIdx(arr, len1 - 1);
processBlockIdx(arr + len1, len2 - 1);
或:
processBlockIdx(arr, lastIdx1);
processBlockIdx(arr + lastIdx1 +1, lastIdx2 - lastIdx1 - 1);
至于你的第二个问题的答案:是的,问题是由于访问一个超出数组范围的元素引起的。由于C没有检查数组边界的安全网,因此这样的错误通常表现为结果中出现的无法解释的值,或者更糟糕的是应用程序崩溃。在某些情况下,你不是那么幸运,它在你的程序中完全不相关的部分表现出问题。因此,最好是非常确定数组元素访问。