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=]
。
我希望 buffer
和 persona
不是函数的形式参数。如果是,
sizeof(buffer)
和
sizeof(persona)
肯定 return 比你预期的要少很多。
关于persona
,你为什么把它做成一个指针,而不是一个常规变量?! malloc() 应该只有在没有其他机会时才使用,正是因为使用不当会很危险。
如果我找到更多,我会告诉你。
我正在做一个 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=]
。
我希望 buffer
和 persona
不是函数的形式参数。如果是,
sizeof(buffer)
和
sizeof(persona)
肯定 return 比你预期的要少很多。
关于persona
,你为什么把它做成一个指针,而不是一个常规变量?! malloc() 应该只有在没有其他机会时才使用,正是因为使用不当会很危险。
如果我找到更多,我会告诉你。