Печать последнего элемента в массиве с использованием оператора if - PullRequest
0 голосов
/ 26 мая 2019

В настоящее время я пытаюсь изучить совместное использование указателей и функций в C, что, на мой взгляд, не так просто. Я пытаюсь напечатать последний элемент в массиве, он на самом деле делает противоположное и печатает первый элемент. Я знаю, что люди обычно используют циклы, но я не могу понять, как это сделать именно с такой проблемой, и поэтому решил, что вместо этого я попробую это с помощью оператора if.

Edit: Почему, если заявление не работает в этом случае? Кажется логичным, что это должно работать ...

Мой файл main.c:

#include <stdio.h>
#include <stdlib.h>
#include "functions.h"
#define Size 7

int main(void) 
{

    int array1[] = { 11, 88, 5, 9, 447, 8, 68, 4 };

    maxValue(array1, Size);

    return 0;
}

Файл My functions.h:

#pragma once

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

int maxValue(const int *, int);

#endif

Файл My functions.c:


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


int maxValue(const int *array1, int Size)
{

    int max = array1[0];

    if (max < array1[Size]) {
        Size++;
        max = array1[Size];
    }

    printf("Max value: %d \n", max);
}


Ответы [ 3 ]

0 голосов
/ 26 мая 2019

Давайте с этими аргументами смоделируем, что делает процессор, когда он входит в функцию maxValue. 1. Переменной max присваивается значение array1[0], равное 11. 2. Если max (11) меньше array1[7] (4). Это не так, поэтому блок if не выполняется. 3. Печать max: печать 11.

Другое дело: ваша программа вызывает неопределенное поведение. Давайте рассмотрим пример, где array1[0] равно 3 вместо 11. Будет выполнен блок if (3 Size увеличивается до 8. max присваивается array1[8]. Поскольку последний индекс в array1 равен 7 (именно так вы объявили массив), вы обращаетесь к адресу памяти, к которому у вас нет доступа. Это неопределенное поведение.

0 голосов
/ 26 мая 2019

Имена maxValue() и max вводят в заблуждение и сбивают с толку то, что вы пытаетесь сделать.lastValue() и last будет иметь гораздо больше смысла.

Однако то, что вы пытаетесь сделать, не имеет смысла в C, поскольку массивы имеют известную длину, поэтому вы можете получить доступ к последнему элементу напрямую:

int array1[] = { 11, 88, 5, 9, 447, 8, 68, 4 };
int array_length = sizeof(array1) / sizeof(*array1) ;
printf("Lastvalue: %d \n", array1[array_length - 1] ) ;

Однако вы не можете сделать это в функции, потому что массивы не являются типами данных первого класса в C, и при передаче в функцию «ухудшаются» до простого указателя без какой-либо информации о размере указанного массива.Вызывающая функция, имеющая информацию о размере, тоже должна это передать (как вы это сделали, но потом, похоже, очень запутались):

void printLast( int* array, int length )
{
    printf( "Lastvalue: %d \n", array1[length - 1] ) ;
}

Трудно понять, почему вы подумали, что вам может понадобиться какой-либо другой код илидля чего предназначена ваша maxValue() функция.Таким образом, «логика», которую вы говорите «должен работать»:

Если значение первого элемента массива меньше значения последнего элемента массива, выведите undefined значение один за концом массива;в противном случае выведите первый элемент массива.

Если вы хотите напечатать последний элемент, то просто напечатаете его, значение первого элемента не имеет к нему никакого отношения.В любом случае вы не должны индексировать после конца массива - это значение не определено.

0 голосов
/ 26 мая 2019

Почему в этом случае оператор не работает?Кажется логичным, что это должно работать ...? Потому что здесь

if (max < array1[Size]) { }

Size определяется как 7, и вы сравниваете array1[0] с array1[7] т.е. 11 < 4 -> false, следовательно, он не входит в блок if, поэтому последний printf выполняется и печатает max.Но это не правильная логика, если if блоки становятся истинными, тогда дальнейшее Size++ вызовет доступ из связанных элементов массива, которые вызывают неопределенное поведение .

int maxValue(const int *array1, int Size)
{
    int max = array1[0];
    if (max < array1[Size]) { /* 11 < 4 false, skips if block */
        //Size++; /* this is wrong as Size++ here and next accessing array1[Size] cause UB due to accessing out of bound array element */
        max = array1[Size];
    }
    printf("Max value: %d \n", max); /* max is stills array1[0] i.e 11 */
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...