Общий динамический массив не обновляет свойства правильно - PullRequest
0 голосов
/ 13 марта 2019

Я создаю общий динамический массив в C. Всякий раз, когда я обновляю какое-либо значение в массиве, оно не обновляется должным образом и, кажется, обновляет все в массиве.Вывод моего основного файла не ожидается.У меня проблемы с поиском ошибки в gdb.

Мой заголовочный файл:

#ifndef INC_6_VECTOR_H
#define INC_6_VECTOR_H
typedef struct Vector_S * Vector;

Vector init_Vector();
void free_Vector(Vector);
void vector_add(Vector, int, void *);
void * vector_value(Vector, int);

#endif //INC_6_VECTOR_H

Мой исходный файл:

#include <stdlib.h>
#include <stdio.h>
#include "Vector.h"

#define STARTINGSIZE 10

struct Vector_S{
    void **head;
    size_t size;
    size_t length;
};

Vector init_Vector(){
    Vector vector = malloc(sizeof(struct Vector_S));
    vector->size = 0;
    vector->length = STARTINGSIZE;
    vector->head = malloc(STARTINGSIZE * sizeof(void *));
    return vector;
}

void free_Vector(Vector vector){
    free(vector->head);
    free(vector);
}
void vector_add(Vector vector, int idx, void * data){
    if (vector->size >= vector->length){
        size_t oldLength = vector->length;
        void *headTemp;
        headTemp = realloc(vector->head, 2*oldLength* sizeof(void *));
        if (headTemp == NULL){
            printf("Failed realloc\n");
            exit(1);
        }
        vector->length = 2*oldLength;
        vector->head = headTemp;
    }
    vector->head[idx] = data;
    vector->size++;

}
void * vector_value(Vector vector, int idx){
    return vector->head[idx];
}

и мой тестовый файл

#include <stdio.h>
#include "Vector.h"
int main(void){
    printf("Main run test\n");
    Vector v = init_Vector();
    for(int i=0; i<10; i++){
        vector_add(v, 0, (void *)&i);
    }
    for(int i=0; i<10; i++){
        printf("The value at %d idx is %d\n", i, *(int*)vector_value(v,i));
    }
}

1 Ответ

1 голос
/ 13 марта 2019

Вы храните указатели в вашем векторе, а не в значениях.В цикле

for(int i=0; i<10; i++){
    vector_add(v, 0, (void *)&i);
}

вы сохраняете 10 раз адрес одной и той же переменной i.

Измените дизайн, если хотите вместо этого сохранить значения.

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