Я пытаюсь написать программу на C для вставки элемента в массив. Я использовал оператор sizeof для определения общего количества элементов массива, но после вставки элемента и повторного использования оператора sizeof кажется, что он работает неправильно (он дает тот же результат без увеличения). Заранее спасибо.
// Exercise N9 - Code Win
// Arrays.
#include <stdio.h>
int main()
{
int user_input;
int array[] = {1,2,3,4,5};
printf("Hey User !\n");
printf("Enter an element :\n");
scanf("%i",&user_input);
int elements_number;
elements_number = sizeof(array) / sizeof(array[0]);
int new_element_index;
new_element_index = elements_number; // Because computer starts from zero.
array[new_element_index] = user_input;
int elements_number_after;
elements_number_after = sizeof(array) / sizeof(array[0]);
int i;
for (i = 0 ; i < 6 ; i++)
{
printf("%i ",array[i]);
}
printf("\n");
printf("%i\n",elements_number);
printf("%i\n",elements_number_after);
return 0;
}
Ваш массив всегда имеет одинаковый размер. То есть он имеет размер, который вы ему выделили. Тот факт, что вы меняете его содержимое, не меняет размер. И нет, вы не можете писать после последнего элемента, поэтому ваш array[new_element_index] = user_input;
неправильный.
for (i = 0 ; i < 6 ; i++)
в любом случае неверно. В массиве всего 5
элементов. Вместо жестко закодированного 6
вы должны были использовать длину elements_number
, которую вы уже вычислили.
Спасибо всем, я все хорошо понял.
ОТ: Исторически sizeof
всегда был оператором времени компиляции, а НЕ функцией времени выполнения... Значение, которое он представляет (представляет), было константой времени компиляции и не менялось во время выполнения... Посмотрите это Вот почему sizeof arr
работает. sizeof( arr )
действителен, но может ввести в заблуждение новичков.
Примечание: хорошая привычка — проверять возвращаемое значение вызовов scanf
. Откуда вы знаете, что это удалось: `scanf("%i",&user_input);? After this line,
user_input` все еще может быть неинициализирован с неопределенным значением. Если вы действительно использовали user_input
, это может вас укусить. Обычно наименее предсказуемым и самым раздражающим образом.
В C массивы не растут; и при этом они не сжимаются.
Итак (игнорируя неопределенное поведение в вашем коде), если ваши вычисления показывают, что размер массива остался прежним после того, как вы сделали... что угодно... тогда это действительно правильно.
Если быть точным, речь идет о реальных массивах; все, что связано с malloc()
, здесь выходит за рамки.
int elements_number;
elements_number = sizeof(array) / sizeof(array[0]);
Вышеупомянутое возвращает 5 (которое должно было храниться в size_t
). Продолжаем дальше:
int new_element_index;
new_element_index = elements_number; // Because computer starts from zero.
array[new_element_index] = user_input;
Последняя строка вызывает неопределенное поведение, поскольку значение new_element_index
равно 5, а array[5]
осуществляет доступ к памяти за пределами границ. Массивы в C имеют фиксированный размер и не увеличиваются автоматически. Вы не можете выделить место для 5 целых чисел, а затем поместить в них 6.
Второе вычисление возвращает 5, поскольку попытка записи на единицу больше размера массива фактически не меняет размер массива. Независимо от того, что вы делаете, оно останется 5.
Вам нужно динамическое распределение памяти, а именно malloc()
и realloc()
.
Возможно, стоит отметить, что sizeof()
бесполезен с динамически выделяемыми массивами, управляемыми с помощью malloc()
, realloc()
и free()
. При использовании динамически выделяемых массивов ОП придется отслеживать размер массива в своем коде.
Почему вы ожидаете, что
elements_number
будет отличаться отelements_number_after
? Они выполняют точно такой же расчет.