C RPC Server malloc повреждение памяти - PullRequest
0 голосов
/ 21 июня 2019

Я выполняю 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)

1 Ответ

1 голос
/ 21 июня 2019
    c2 = malloc(strlen(buffer));
    strcpy(c2, buffer);

Нет места в c2 для финала \0.


Я надеюсь, buffer и persona не являются формальными параметрами функции. Если да,

sizeof(buffer)

и

sizeof(persona)

определенно вернет намного меньше, чем вы ожидаете.


О persona, почему вы делаете его указателем, а не обычной переменной ?! malloc () следует использовать только тогда, когда нет другого шанса, именно потому, что он опасен при неправильном использовании.


Я скажу вам, если найду больше.

...