C语言 如何解决此问题(引发异常)

pobjuy32  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(190)
#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

void input_count(int*);
int* input_values(int);
void show_result(int**, int);

int main()
{
    int count = 0;
    input_count(&count);
    int* array = input_values(count);
    show_result(&array, count);
    return 0;
}

void input_count(int* count)
{
    do
    {
        printf("배열의 개수는? (0보다 커야합니다) ");
        scanf("%d", count);
    } while (*count <= 0);
}
int* input_values(int count)
{
    int* array = (int*)malloc(sizeof(int) * count);
    for (int i = 0; i < count; ++i)
    {
        printf("%d번째 값은? ", i);
        scanf("%d", array + i);
    }
    return array;
}
void show_result(int** array, int count)
{
    int max = 0, min = INT_MAX;

    int* max_address = NULL, *min_address = NULL;

    for (int i = 0; i < count; ++i)
    {
        if (*array[i] > max)
        {
            max_address = *array + i;
            max = *max_address;
        }
        if (*array[i] < min)
        {
            min_address = *array + i;
            min = *min_address;
        }
    }
    printf("최대 원소의 주소: %p, 값: %d\n", max_address, max);
    printf("최소 원소의 주소: %p, 값: %d\n", min_address, min);
}

我学编程才10天,技术还很差,但我想解决这个问题。
show_result函数抛出异常:
抛出的异常(0x00007FF6BE02596B,Main.exe):0xC0000005:0xFFFFFFFFFFFFFF.
图片:

我认为Null是问题所在,但我不知道反向引用的含义。

s3fp2yjn

s3fp2yjn1#

通过指向动态分配数组的指针按引用传递指向该数组的指针是没有意义的

show_result(&array, count);

因为指针在函数show_result中没有改变。
因此声明函数如下

void show_result( const int *, size_t );

并称之为

show_result( array, count);

if语句

if (*array[i] > max)

以及

if (*array[i] < min)

使用无效表达式。您必须至少编写为

if ( ( *array )[i] > max)

以及

if ( ( *array )[i] < min)

如果将声明如上所示的函数,则不会出现这样的问题。
同时将变量max设置为0

int max = 0, min = INT_MAX;

没有意义。因为数组的元素类型是int,所以它可以包含所有由负数设置的元素。在这种情况下,您将得到错误的结果。
例如,可以通过以下方式定义函数

void show_result( const int *array, size_t count) 
{
    const int *max_address = array; 
    const int *min_address = array;

    for ( size_t i = 1; i < count; ++i )
    {
        if ( *max_address < array[i] )
        {
            max_address = array + i;
        }
        else if ( array[i] < *min_address )
        {
            min_address = array + i;
        }
    }

    if ( count != 0 )
    {
        printf( "최대 원소의 주소: %p, 값: %d\n", ( const void * )max_address, *max_address );
        printf( "최소 원소의 주소: %p, 값: %d\n", ( const void * )min_address, *min_address );
    }
    else
    {
        // output a message that an empty array is passed 
    }
}

相关问题