Последний элемент массива структуры - C - PullRequest
0 голосов
/ 04 июля 2018

Я немного запутался в вещах:

Если у меня есть массив структур: table с длиной X, и я хочу получить доступ к последнему его элементу: table[X] или table[X-1]. Если это table[X-1], что содержит table[X]?

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Массивы в C используют нулевое индексирование, то есть они начинаются с 0 и заканчиваются n-1. Не путать с объявлениями массивов, где вы пишете размер, выраженный в количестве элементов. Синтаксис для доступа к массиву и его объявления выглядит примерно так, поэтому это может сбивать с толку новичков.

Пример:

int main (void)
{
  int array[5]; // allocate an array with 5 elements
  array[0] = 0; // access first element
  array[4] = 0; // access last element (index 4)

  array[5] = 0; // BAD, accessing the array out of bounds: index 5 gives item number 6
}

И вот почему канонический способ записи циклов в C таков:

for(int i=0; i<n; i++)

, где n - размер массива, а итератор i будет иметь значения от 0 до n-1.

0 голосов
/ 04 июля 2018

Индексирование массива в C начинается с нуля, то есть первый элемент будет в table[0], второй в table[1], третий в table[2] ... и последний в table[X-1].

table[X] находится за пределами границ массивов. В C нет проверки границ, поэтому компилятор позволяет получить к нему доступ, но это неопределенное поведение, то есть вы никогда не узнаете, что происходит. Чтение этого может вернуть мусор памяти или может привести к исключению ОС как ошибка сегментации.

0 голосов
/ 04 июля 2018

Ответ одинаков для любого вида массива. Если у вас есть один с размером X:

int a[5];
struct my_struct ms[10];
...

вы указываете количество элементов в этом массиве. Поскольку 1-й элемент - это элемент 0, последний элемент всегда X - 1.

Если вы попытаетесь получить доступ к элементу a[X], вы получите неопределенное поведение .

0 голосов
/ 04 июля 2018

Структуры работают в памяти так же, как в этом случае целое число или некоторый другой базовый тип данных. Ваш массив будет просто разделен sizeof (struct) вместо sizeof (базовый тип данных).

Он по-прежнему начинается с 0 и заканчивается в X - 1. Тип массивов обычно просто определяет две вещи:

Количество байтов на индекс и способ обработки данных.

Изобразите массив размером 3 со структурами, которые содержат 5 байтов данных. Ваш массив будет установлен следующим образом:

-----|-----|-----|????|
s1   |s2   |s3   |????|

То, что она существует, не означает, что наша программа знает, что это такое. 4-й [3] индекс (????) будет индексом за пределами нашего массива. Возможно, однако, вы могли бы получить какое-то значимое значение здесь, но очень маловероятно. В большинстве случаев это будет либо мусор, либо ошибка.

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