#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: 0xFFFFFFFFFFFFFFFF 위치를 읽는 동안 액세스 위반이 발생했습니다.
Изображений:
Я думаю, что проблема в Null, но я не знаю, что означает обратная ссылка.
У вас слишком много косвенности с show_result(&array, count);
и void show_result(int** array, int count)
. Массив не является массивом указателей.
Минор: int max = 0
должно быть int max = INT_MIN
.
Предполагая, что вы решите проблему косвенности, ни max
, ни min
даже не нужны. Подумайте, на что должны указывать min_address
и max_address
, прежде чем войти в цикл. Это должно помочь понять, почему min
и max
лишние.
*array[i]
то же самое, что и *(array[i])
, а это не то, что вам нужно. Вы хотите (*array)[i]
. Тем не менее .... зачем передавать &array
на show_result
? Просто передайте array
напрямую.
Нет смысла передавать указатель на динамически размещаемый массив по ссылке через указатель на него
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
}
}
Спасибо, сэр. я люблю тебя, я хочу использовать двойной указатель. но вы знаете, что я использую только один указатель. хорошего дня
если я использую const в качестве параметра, это приводит к ошибке. я пытаюсь стереть константу. не ошибка
@프린이 Функция должна быть скомпилирована с квалификатором const первого параметра.
Я понимаю и решаю! спасибо спасибо спокойной ночи!
не получая никаких ошибок при добавлении,
#include <limits.h>