我正在学习C,我正在尝试创建一个能够返回更多内容的函数。我已经编写了代码,但其中一个值没有给我正确的输出,我无法弄清楚为什么会这样做。
struct num {
int min;
int max;
};
struct num Some(int Array[]) {
int i;
struct num result;
result.max = Array[0];
result.min = Array[0];
for(i = 0; i<=3; i++) {
if(result.min > Array[i]) {
result.min = Array[i];
} else if(result.max < Array[i]) {
result.max = Array[i];
}
}
return result;
}
int main()
{
int Array[] = {7,8,3};
struct num something;
something = Some(Array);
printf("Total is %d and max is %d",something.min,something.max);
}
程序打印数组的正确最小值,但它给出的最大值为4200784。
答案 0 :(得分:8)
for(i = 0;i<=3;i++){
// ^^^^
你循环四次。
在包含三个元素的数组上。
答案 1 :(得分:1)
您使用的索引范围不正确。由于原始数组只有3个元素,因此索引的有效范围为[0, 2]
。因此在函数循环中
for(i = 0; i<=3; i++) {
当我等于3时,你试图访问数组之外的内存。
但无论如何功能设计并不好。它使用幻数3.因此它只能应用于三个元素的数组。此外,您无法确定哪个元素是最小元素,哪个元素是最大元素。
更好的方法是以下
typedef struct minmax
{
size_t min;
size_t max;
} minmax_t;
minmax_t minmax_element( const int a[], size_t n )
{
minmax_t result = { 0, 0 };
for ( size_t i = 0; i < n; i++ )
{
if ( a[i] < a[result.min] )
{
result.min = i;
}
else if ( a[result.max] < a[i] )
{
result.max = i;
}
}
return result;
}
在主要功能中可以通过以下方式调用
int main()
{
int a[] = { 7, 8, 3 };
minmax_t something;
something = minmax_element( a, sizeof( a ) / sizeof( *a ) );
printf( "Minimum is %d and max is %d\n", a[something.min], a[something.max] );
int b[] = { 7, 8, 3, 0, 1, 5, 9 };
something = minmax_element( b, sizeof( b ) / sizeof( *b ) );
printf( "Minimum is %d and max is %d\n", b[something.min], b[something.max] );
}
考虑到在C ++中有标题std::minmax_element
中声明的相应算法<algorithm>
它返回第一个最小元素和最后一个最大元素的一对指针(迭代器)。你可以改变我所展示的函数,它也会返回数组中最后一个最大元素的索引,而不是第一个最大元素。
答案 2 :(得分:0)
sizeof
要获得正确的分辨率,您应该使用上述内容来获取要使用的数组的确切大小,而不是i <= 3。