Указатели как поля данных членов в структурах C ++ - PullRequest
0 голосов
/ 20 июня 2019
#include <iostream>
using std::cout;
using std::cin;

void printArray(int A[], int size) {
    for(int i = 0; i < size; i++) {
        cout << A[i] << "\t";
    }
    cout << "\n";
}

struct Array {
    int *A;
    int size;
    int length;
};

void display(Array *arr) {
    for(int i = 0; i < arr->length; i++) {
        cout << arr->A[i] << "\t";
    }
    cout << "\n";
}

void fillArray(Array *arr) {
    for(int i = 0; i < arr->length; i++) {
        cin >> arr->A[i];
    }
}

void add(Array *arr, int x) {
    if(arr->length < arr->size) {
        arr->A[++arr->length] = x;
    }
}

int main() {
    Array arr;
    cout << "arr.size before initializing: " << arr.size << "\n"; // gives a garbage value
    cout << "Enter the size of the array: ";
    cin >> arr.size;
    cout << "Output of arr variable &arr: " << &arr << "\n";
    arr.A = new int[arr.size];
    cout << "arr.length before initializing: " << arr.length << "\n"; // gives garbage value
    cout << "How many elements do you want to enter: ";
    cin >> arr.length;
    fillArray(&arr); //This is not pass by value but pass by reference because 
    display(&arr); // this function displays the values of arr
    add(&arr, 15);
    cout << "The length of the array after adding: " << arr.length << "\n";
    display(&arr);
    printArray(arr.A, arr.length);
}

Вывод этой программы выглядит так:

$ ./array_adt 
arr.size before initializing: -140717888
Enter the size of the array: 10
Output of arr variable &arr: 0x7ffe4e0ec040
arr.length before initializing: 21932
How many elements do you want to enter: 5
4 6 7 3 2 
4   6   7   3   2   
The length of the array after adding: 6
4   6   7   3   2   0   
4   6   7   3   2   0

Я очень смущен, почему элемент 15 не добавляется в массив структуры (который на самом деле является указателем, который инициализируется для массива в куче). Если кто-то может пролить свет на это, это было бы здорово для многих людей, а также для глубокого понимания концепций c ++.
Большое спасибо.

1 Ответ

3 голосов
/ 20 июня 2019
arr->A[++arr->length] = x;

должно быть

arr->A[arr->length++] = x;

Индексы массива начинаются с нуля в C ++, поэтому первый элемент после конца массива arr размера N равен arr[N]. Другими словами, 15 действительно был добавлен в массив, но не в нужном месте.

Также ваш код теряет память, поскольку массив, выделенный в main, никогда не удаляется. Правильное распределение динамической памяти - большая (и очень важная) тема. Проконсультируйтесь со своей любимой книгой по C ++, в частности, вам следует изучить правило трех

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