为什么输出不显示?

问题描述 投票:0回答:2
#include <stdio.h>

void MaxAndMin(int* arr, int** max, int** min)
{
    int i;
    **max = **min = arr[0];
    for (i = 1; i < 5; i++)
    {
        if (**max < arr[i])
        {
            **max = arr[i];
        }
        else
            continue;
    }
    for (i = 1; i < 5; i++)
    {
        if (**min > arr[i])
        {
            **min = arr[i];
        }
        else
            continue;
    }
}

int main(void)
{
    int* maxPtr;
    int* minPtr;
    int arr[5];
    int i;
    for (i = 0; i < 5; i++)
    {
        printf("입력:");
        scanf("%d", &arr[i]);
        printf("\n");
    }
    MaxAndMin(arr, &maxPtr, &minPtr);
    printf("%d %d", *maxPtr, *minPtr);
}

这是指针的问题。我想打印出 arr 的最小值和最大值,但我不能。结果只是输入arr值就结束了,那么问题出在哪里呢?如果设置指针变量有任何问题请告诉我

c pointers
2个回答
4
投票

您似乎误解了有关在 C 中模拟通过引用传递的内容。

指针

maxPtr
minPtr
未初始化,它们指向不确定位置。在
MaxAndMin
函数中取消引用它们会导致 未定义的行为,并且可能会因分配而崩溃。

您应该将

max
min
声明为普通
int
变量,然后将指针传递给它们:

int max = 0;
int min = 0;
MaxAndMin(arr, &max, &min);
printf("%d %d", max, min);

并更新函数以对应于该更改:

void MaxAndMin(int *arr, int *max, int *min)
{
    *max = *min = arr[0];
    // ... etc...
}

0
投票

这就是所谓的“随机添加

&
*
,直到看起来有效”,或者“多个
*
看起来很可疑”,我们都曾经历过这样的情况。 ;-)

int* maxPtr;

这是一个int 指针

MaxAndMin(arr, &maxPtr, &minPtr);

这会将 int 指针的地址传递给函数。

void MaxAndMin(int *arr, int** max, int** min)

函数采用 int 指针的地址作为参数。

**max = **min = arr[0];

这里变得棘手:

max
指向int的指针的地址。因此,
*max
指向int的指针,
**max
是指向的int

但是这里有一个问题。

*max
,推而广之,
maxPtr
中的
main()
从未被要求指向任何东西。将
int
[1] 写入
maxPtr
恰好指向的不确定地址是未定义行为

想要的是

max
,并且通过扩展,
maxPtr
中的
main()
arr[0]
的地址:

*max = *min = &arr[0];


一般来说,更改函数的参数是不好的风格。有时是必要的,但最好避免。函数的更简洁设计是声明一个

struct { int * min; int * max; } min_max_t;

,并将其用作 
MaxAndMin()
 的返回值:

// Untested struct { int * min; int * max; } min_max_t; struct min_max_t MinAndMax( int * arr ) { struct min_max_t rc; rc.min = rc.max = &arr[0]; // ...work with rc.min and rc.max return rc; } int main(void) { int arr[5]; for ( int i = 0; i < 5; ++i ) { printf( "입력:" ); if ( scanf( "%d", &arr[i] ) != 1 ) { puts( "Non-numeric value entered!" ); return EXIT_FAILURE; } printf( "\n" ); } struct min_max_t rc = MaxAndMin( arr ); printf( "%d %d", *rc.max, *rc.min ); }


[1]

arr[0]

,它可能已经或可能没有被你的 
scanf()
 初始化——你不知道,因为你没有检查 
scanf()
 的返回值...

© www.soinside.com 2019 - 2024. All rights reserved.