Оператор Sizeof не работает должным образом после вставки элемента

Я пытаюсь написать программу на 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;
}

Почему вы ожидаете, что elements_number будет отличаться от elements_number_after? Они выполняют точно такой же расчет.

Weather Vane 01.05.2024 21:24

Ваш массив всегда имеет одинаковый размер. То есть он имеет размер, который вы ему выделили. Тот факт, что вы меняете его содержимое, не меняет размер. И нет, вы не можете писать после последнего элемента, поэтому ваш array[new_element_index] = user_input; неправильный.

Eugene Sh. 01.05.2024 21:26
for (i = 0 ; i < 6 ; i++) в любом случае неверно. В массиве всего 5 элементов. Вместо жестко закодированного 6 вы должны были использовать длину elements_number, которую вы уже вычислили.
Weather Vane 01.05.2024 21:26

Спасибо всем, я все хорошо понял.

Fady Saad 01.05.2024 22:41

ОТ: Исторически sizeof всегда был оператором времени компиляции, а НЕ функцией времени выполнения... Значение, которое он представляет (представляет), было константой времени компиляции и не менялось во время выполнения... Посмотрите это Вот почему sizeof arr работает. sizeof( arr ) действителен, но может ввести в заблуждение новичков.

Fe2O3 01.05.2024 23:11

Примечание: хорошая привычка — проверять возвращаемое значение вызовов scanf. Откуда вы знаете, что это удалось: `scanf("%i",&user_input);? After this line, user_input` все еще может быть неинициализирован с неопределенным значением. Если вы действительно использовали user_input, это может вас укусить. Обычно наименее предсказуемым и самым раздражающим образом.

Chris 01.05.2024 23:27
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В 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(). При использовании динамически выделяемых массивов ОП придется отслеживать размер массива в своем коде.

Jonathan Leffler 01.05.2024 22:34

Другие вопросы по теме