Значение указателя неожиданно меняется при передаче в функцию - PullRequest
0 голосов
/ 01 ноября 2019

Итак, я пытаюсь реализовать arrayList в C, но получаю некоторые ошибки. Когда я равен 4 в цикле for в основной функции, вызывается insertArrayList для вставки числа 4. После вставки 4 в мой массив содержимого первые 5 элементов моего массива равны 0,1,2,3,4. Но затем после моего вызова PrintArray первый элемент в моем массиве изменит 6422016. Я не могу понять, почему это происходит. Любая помощь будет оценена. Спасибо.

#include <stdlib.h>
#include <math.h>

struct ArrayList{
    int numItemsInserted;
    int size;
    int *contents;
};

void initializeArrayList(struct ArrayList *a, int size){
    (*a).numItemsInserted= floor(size / 2);
    (*a).size = size;
    (*a).contents = malloc(sizeof(int) * size);
}

void PrintArray(struct ArrayList *a){
    for (int i = 0 ; i < (*a).numItemsInserted; i++){
        printf("%i ", (*a).contents[i]);
    }
    printf("\n");
}
struct ArrayList insertArrayList(struct ArrayList *a, int num){
    if((*a).numItemsInserted == (*a).size){
        int newContents[(*a).size * 2];
        for (int i = 0; i < (*a).size; i++){
            newContents[i] = (*a).contents[i];
        }


        (*a).contents = newContents;
        (*a).size *= 2;

    }
    (*a).contents[(*a).numItemsInserted] = num;
    (*a).numItemsInserted += 1;
    PrintArray(a);
}


int main() {
    struct ArrayList a1;
    initializeArrayList(&a1, 1);
    for (int i =0; i < 10; i ++){
        if (i == 1){
            printf("a");

        }
        insertArrayList(&a1, i);
    }

    return 0;
}```

1 Ответ

3 голосов
/ 01 ноября 2019

(*a).contents = newContents; назначает адрес (первый элемент) локального массива newContents на (*a).contents. Как только ArrayList возвращается, newContents перестает существовать в модели вычислений C.

Правильный способ увеличить массив - это использовать realloc для запроса большего выделения. Во-первых, запросите дополнительную память:

int *NewContents = realloc(a->contents, NumberOfElementsDesired * sizeof *NewContents);

Затем проверьте, успешно ли выполнен запрос:

if (NewContents == NULL)
{
    fprintf(stderr, "Error, failed to allocate memory.\n");
    exit(EXIT_FAILURE);
}

Затем запишите адрес новой памяти:

a->contents = NewContents;

После этого заполните новые элементы.

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