Как получить последний элемент массива увеличенного размера? - PullRequest
0 голосов
/ 13 мая 2019
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int capacity = 5;
  int used = 0;
  int *arr = (int *)malloc(sizeof(int) * capacity);

  printf("Insert numbers one by one, send -999 to break input flow: \n");
  for (;;)
  {
    int num;
    scanf("%d", &num);

    if (num == -999)
    {
      break;
    }

    if (used == capacity)
    {
      capacity *= 2;
      arr = (int *)realloc(arr, sizeof(int) * capacity);
    }

    arr[used] = num;
    used++;
  }

  return 0;
}

Представьте, что «используемая» переменная неизвестна, как и «емкость». Вы получаете массив неизвестной длины. Как бы вы получили последний «полезный» элемент массива?

Ответы [ 2 ]

2 голосов
/ 13 мая 2019

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

Один из способов сделать это - запомнить индекс последнего элемента, которому было присвоено значение.

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

Существуют и другие способы, но все они связаны с тем, что программа поддерживает свою собственную информацию. C не предоставляет никаких таких услуг.

1 голос
/ 13 мая 2019

Звучит так, будто вам нужна функциональность инкапсулированного массива в стиле Javascript. Вы должны будете сделать свой собственный в C. Проверьте эту ссылку, подробно описывает ... https://www.happybearsoftware.com/implementing-a-dynamic-array

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...