首页 > 解决方案 > C RPC 服务器 malloc 内存损坏

问题描述

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

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

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

编辑修复:问题是“角色”上的 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 中得到了错误

错误:malloc():内存损坏中止(核心转储)

要测试的新输出:

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

Malloc 之前的 Cadena:Malloc 之后的 Juan Cadena Malloc2 之前的 Juan Cadena:92312321C Malloc2 之后的 Cadena:92312321C

Malloc 的 Cadena 前注:Pepe Macias Cadena malloc 的 dps Pepe Macias Cadena Malloc2 的前注:39421294D Malloc2 的 Cadena despues:39421294D

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

标签: crpc

解决方案


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

c2决赛没有空间了\0


我希望buffer并且persona不是函数的形式参数。如果是,

sizeof(buffer)

sizeof(persona)

绝对回报比您预期的要少得多。


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


如果我发现更多,我会告诉你。


推荐阅读