【问题标题】:C RPC Server malloc memory corruptionC RPC 服务器 malloc 内存损坏
【发布时间】:2019-11-04 02:56:58
【问题描述】:

我正在执行一个 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" malloc之后的Cadena Alberto //在malloc之后打印角色->nombre Malloc2之前的Cadena:33445511J Malloc2 之后的 Cadena: 33445511J //printing persona->dni after malloc

马洛克之前的卡德纳:胡安 malloc Juan 之后的 Cadena Malloc2之前的Cadena:92312321C Malloc2后的Cadena:92312321C

Malloc 的 Cadena antes:Pepe Macias malloc Pepe Macias 的 Cadena dps Malloc2 的 Cadena antes:39421294D Malloc2 的 Cadena depues: 39421294D

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

【问题讨论】:

    标签: c rpc


    【解决方案1】:
        c2 = malloc(strlen(buffer));
        strcpy(c2, buffer);
    

    c2 没有空间给最后的\0


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

    sizeof(buffer)
    

    sizeof(persona)
    

    回报肯定比你预期的要少。


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


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

    【讨论】:

    • 我认为有一个工作正常,问题出在最后一次迭代中循环的最后一个 malloc (person->dni = malloc(...))
    • 我只是很好。那没有。你应该使用 c2 = malloc(strlen(buffer)+1); 如果你使用 UTF-8 / Unicode / 不管,你可能需要更多的 +1
    • 你在几个地方犯了同样的错误,包括(person->dni = malloc(...))。您收到的消息很可能是分配的内存不足。
    • 我已将输出添加到问题中,无论如何,如果是这种情况,strdup 应该可以工作,对吧?而且没有
    • 如果你写错了内存地址,任何事情都不会确定地工作。一旦内存被破坏至少一次,一切的行为都被认为是随机的。请按照我告诉你的更正,然后看看会发生什么。
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多