Я выполняю RPC-программу, и на стороне сервера у меня повреждена память, но я не знаю точно, почему, все функции работают нормально, кроме этой.
Сначала я попробовал с strndupа затем измените его для malloc и strcpy для переменных структуры, но оба не работают.
РЕДАКТИРОВАТЬ: также пробовал strdup, все еще повреждение памяти
РЕДАКТИРОВАТЬ ИСПРАВЛЕНО: Проблема была в malloc на "персона", размер неправильный.
Структуры
struct facturar {
int idReserva;
int idReg;
int idPlaza;
int fila;
int asiento;
char *nombre;
char *dni;
struct facturar *siguiente;
};
typedef struct facturar facturar;
struct datos_facturacion {
struct facturar *lista;
};
typedef struct datos_facturacion datos_facturacion;
static datos_facturacion result;
char buffer[200];
struct facturar * persona;
xdr_free((xdrproc_t)xdr_datos_facturacion,(char *)&result);
// ...
f = fopen("DatosReservas", "r");
f2 = fopen("Ffacturacion", "a");
idr = argp->idVuelo;
while(fgets(buffer, sizeof(buffer), f) != NULL){
c2 = malloc(strlen(buffer) + 1);
strcpy(c2, buffer);
c = strtok_r(c2, ":", &c1);
printf("%d-%d-\n", idr, atoi(c));
if(idr == atoi(c)){
persona = malloc(sizeof(persona));;
persona->idReserva = idr;
fprintf(f2, "%d:", idr);
c = strtok_r(NULL, ":", &c1);
printf("%s\n", c);
persona->idReg = idreg;
fprintf(f2, "%d:", idreg);
c = strtok_r(NULL, ":", &c1);
printf("%s\n", c);
persona->idPlaza = atoi(c);
fprintf(f2, "%d:", atoi(c));
if(asAsignado == asiento){
fAsignada = fAsignada + 1;
asAsignado = 1;
}
persona->fila = fAsignada;
fprintf(f2, "%d:", fAsignada);
persona->asiento = asAsignado;
fprintf(f2, "%d:", asAsignado);
c = strtok_r(NULL, ":", &c1);
printf("Cadena antes de Malloc: %s\n", c);
persona->nombre = malloc(strlen(c) + 1);
strcpy(persona->nombre, c);
fprintf(f2, "%s:", c);
c = strtok_r(NULL, ":", &c1);
printf("Cadena dps de malloc %s\n", persona->nombre);
printf("Cadena antes de Malloc2: %s\n", c);
persona->dni = malloc(strlen(c) + 1);
strcpy(persona->dni, c);
printf("Cadena despues de Malloc2: %s\n", persona->dni);
fprintf(f2, "%s\n", persona->dni);
persona->siguiente = result.lista;
result.lista = persona;
}
free(c2);
}
fclose(f);
fclose(f2);
return &result;
На последней итерации я получил ошибку в последнем malloc
Ошибка: malloc (): повреждение памятипрервано (ядро сброшено)
Новый вывод для проверки:
Кадена до Malloc: Alberto // печать "c" strtok_r Cadena после malloc Alberto // печать персонажа->nombre после malloc Кадена до Malloc2: 33445511J Кадена после Malloc2: 33445511J // печать персоны-> dni после malloc
Кадена до Malloc: Хуан Кадена после malloc Хуан Кадена до Malloc2: 92312321C Кадена послеMalloc2: 92312321C
Cadena antes Malloc: Pepe Macias Cadena dps malloc Pepe Macias Cadena antes Malloc2: 39421294D Cadena презирает Malloc2: 39421294D
Кадена перед Malloc: Игнасио Гутиovedilla Cadena после Malloc Игнасио Гутьеррес Povedilla Cadena после Malloc2: 92123421Y malloc (): повреждение памяти Abortado (`core 'generado)