C RPC 服务器 malloc 内存损坏

C RPC Server malloc memory corruption

我正在做一个 RPC 程序,在服务器端我的内存被破坏了,但我不知道为什么,所有的功能都可以正常工作,但这个。

我先尝试使用 strndup,然后将其更改为结构变量上的 malloc 和 strcpy,但两者都不起作用。

编辑:也试过 strdup,仍然内存损坏

编辑修复:问题是 "persona" 上的 malloc,sizeof 错误。

结构

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 中得到了错误

Error : malloc(): memory corruption aborted (core dumped)

New output to test :

Malloc 之前的 Cadena:Alberto // 打印 "c" of strtok_r Cadena after of malloc Alberto // printing persona->nombre after malloc Malloc2之前的Cadena:33445511J Malloc2 之后的 Cadena:33445511J //打印 persona->dni after malloc

Malloc 之前的 Cadena:Juan malloc Juan之后的卡德纳 Malloc2之前的Cadena:92312321C Malloc2 之后的 Cadena:92312321C

Malloc 的 Cadena antes:Pepe Macias cadena dps 的 malloc Pepe Macias Malloc2 的 Cadena antes:39421294D Cadena despues of Malloc2: 39421294D

Malloc 之前的 Cadena:Ignacio Gutierrez Povedilla Malloc Ignacio Gutierrez Povedilla 之后的 Cadena Malloc2之前的Cadena:92123421Y malloc():内存损坏 Abortado(“核心”generado)

    c2 = malloc(strlen(buffer));
    strcpy(c2, buffer);

c2 中没有空间用于最后的 [=14=]


我希望 bufferpersona 不是函数的形式参数。如果是,

sizeof(buffer)

sizeof(persona)

肯定 return 比你预期的要少很多。


关于persona,你为什么把它做成一个指针,而不是一个常规变量?! malloc() 应该只有在没有其他机会时才使用,正是因为使用不当会很危险。


如果我找到更多,我会告诉你。