пожалуйста, объясните выход следующего кода - PullRequest
0 голосов
/ 20 июня 2019

Я пытался вставить новый элемент в заданный массив по заданному индексу.хотя я могу вставить новый элемент, но у меня мало сомнений ..

  1. почему он вставлен в 7-й индекс вместо 3?
  2. как значение переменной k становится 7?
  3. почему размер старого и нового массива одинаков, хотя у нового массива есть еще 1 элемент?

заранее спасибо.любая помощь будет оценена.

int main()
{

    int arr[] = {1,2,3,4,5,6,7};
    int n = sizeof(arr)/sizeof(arr[0]);
    int k = 3;

    cout << "elements of old array" << endl;
    for (int i=0; i<n; i++){
        cout << arr[i] << endl;
    }
    cout << "size of old array  " << sizeof(arr) << endl << endl << endl;

    // inserting new element

    for (int j=n; j>k; j--){
        arr[j] = arr[j-1];
    }

    arr[k] = 10;

    cout << "elements of new array  " << endl;
    for (int i=0; i<=n; i++){
        cout << arr[i] << endl;
    }
    cout << "size of new array " << sizeof(arr)<< endl ;

   }

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Classic C Memory Вопрос!

Когда вы объявляете arr как массив, он имеет фиксированную длину ... таким образом, фиксированный объем памяти. Смещая все элементы arr вправо, вы фактически не увеличиваете размер arr, вы просто записываете всю память, непосредственно примыкающую к arr.

Это объясняет, почему k устанавливается на 7. k должно храниться в памяти рядом с концом arr. Таким образом, когда вы сдвигаете arr [n-1] в arr [n], k устанавливается на 7.

Если вы хотите это исправить, я бы предложил создать новый массив размером n + 1, а затем скопировать все элементы с их новыми индексами.

1 голос
/ 20 июня 2019

Массив имеет фиксированный размер после его создания; ваш массив имеет длину 7, и все - он не изменится.

Ваш код сдвигает массив на один элемент, что включает запись в arr[7], что означает «сохранить это значение в восьмом элементе массива arr», и компилятор, к счастью, делает это - нет проверки границ для массивы в C ++. Тем не менее, он не увеличивает длину массива, он просто записывает в память, где восьмой элемент был бы, если бы массив был длиной восемь элементов.

В вашем коде так получилось, что память, в которой находился бы восьмой элемент, на самом деле хранит переменную k, поэтому значение k меняется на 7 (я подозреваю, что переменная n был оптимизирован, иначе это было бы n, которое было изменено).

Короче говоря, обработка массивов в C ++ (и C) чревата опасностью, и вы должны быть очень осторожны. В любом текущем и / или производственном коде вы должны использовать std::vector.

...