C значения динамического массива неверны - PullRequest
0 голосов
/ 05 июня 2018

в основном в этом коде я сохраняю содержимое из текстового файла в динамический массив (до тех пор, пока все хорошо), но когда я пытаюсь перераспределить память и добавить больше структур, некоторые значения в середине получаются неправильными, всегда одинаковымикод, который я использовал для сохранения в динамический массив

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "header.h"

int iniF(guitarra *vg,int *tamvg)
{
int ch=0, i;

FILE *g;

g = fopen("guitarras.txt", "r"); // abrir ficheiro

if(g == NULL)
{
    printf("Erro ao abrir ficheiro %s", "guitarras.txt");
}

while(!feof(g)) //check how many lines the file have
{
    ch = fgetc(g);
    if(ch == '\n')
    {
        (*tamvg)++;
    }
}

fseek(g, 0, SEEK_SET);

vg = malloc(*tamvg * sizeof(guitarra));

for(i=0; i<*tamvg; i++)
{
    fscanf(g, ("%d %f %f %d %s"), &vg[i].id, &vg[i].pdia, &vg[i].valor, &vg[i].estado, &vg[i].nome );
}

fclose(g);
return vg;
}

и перераспределение

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

 int addguit(guitarra *vg, int *tamvg)
{

int stop=0;


do
{
    vg = realloc(vg, sizeof(guitarra)); //allocating one size of struct guitarra
    printf("Id: ");
    scanf("%d", &vg[*tamvg].id);
    printf("Preco por dia: ");
    scanf("%f", &vg[*tamvg].pdia);
    printf("Valor: ");
    scanf("%f", &vg[*tamvg].valor);
    printf("Estado: ");
    scanf("%d", &vg[*tamvg].estado);
    printf("Nome: ");
    scanf("%s", &vg[*tamvg].nome);
    printf("Deseja adicionar mais guitarras ao stock? Sim[1] Nao[0]: "); //asking if wants to allocate one more
    scanf("%d", &stop);
    (*tamvg)++;
}
while(stop==1);

return vg;
}

значения простые "1 1 1 1 a";"2 2 2 2 b", и так далее, вы получите это.

вот экран печати того, о чем я говорю

ptrscr проблемы

1 Ответ

0 голосов
/ 05 июня 2018

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

vg = realloc(vg, sizeof(guitarra)*(*tamvg+1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...