C语言 为什么不显示输出?

6rvt4ljy  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(148)
#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值,那么问题出在哪里呢?如果设置指针变量有什么问题,请告诉我

anhgbhbe

anhgbhbe1#

你似乎误解了在C中模拟通过引用传递的一些东西。
指针maxPtrminPtr没有初始化,它们指向 * 不确定 * 的位置。在MaxAndMin函数中取消引用它们,会导致 *undefined行为 *,并且可能会在赋值时崩溃。
你应该将maxmin声明为普通的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...
}

s4n0splo

s4n0splo2#

这被称为“随机添加&*,直到它看起来有效”,或者“多个*看起来可疑”,我们都曾在一个点上遇到过。;-)

int* maxPtr;

字符串
这是一个指向int的指针。

MaxAndMin(arr, &maxPtr, &minPtr);


这将 address of pointer-to-int 传递给函数。

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


函数以 address of pointer-to-int 作为参数。

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


这就有点棘手了:max是 * 指向int的指针的地址 。因此,*maxpointer-to-int,而**max是所指向的 int
但你现在有个问题。*max,通过扩展,maxPtrmain()中,
从来没有指向任何东西 *。将int值[1]写入maxPtr恰好指向的不确定地址是undefined behavior
你想要的是max,通过扩展,main()中的maxPtr,以 * 指向 * 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 );
}


也就是说,实际上并不需要首先使用指针 *,因为您的函数目前 *。(你可能在以后的某个时候需要它们,或者作为一个学习练习来做,这两个都是有效的考虑因素,我只是说你可以在没有它们的情况下解决这个问题。

struct
{
    int min;
    int max;
} min_max_t;

struct min_max_t MaxAndMin( int * arr )
{
    struct min_max_t rc;
    rc.min = rc.max = arr[0];

    // assign values, instead of dealing with pointers

    return rc;
}

int main(void)
{
    // ...
    
    printf( "%d %d", rc.max, rc.min );
}


至于你的双循环,请注意,你可以在同一个循环中检查maxmin *,这更有效。你也可以在没有continue的情况下这样做,它是break稍微不那么邪恶的表亲:

for ( int i = 1; i < 5; ++i )
{
    if ( rc.min > arr[i] )
    {
        rc.min = arr[i];
    }

    if ( rc.max < arr[i] )
    {
        rc.max = arr[i];
    }
}


[1]arr[0],它可能已经被你的scanf()初始化了,也可能没有--你不知道,因为你没有检查scanf()的返回值......

相关问题