c - 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)
解决方案
c2 = malloc(strlen(buffer));
strcpy(c2, buffer);
c2
决赛没有空间了\0
。
我希望buffer
并且persona
不是函数的形式参数。如果是,
sizeof(buffer)
和
sizeof(persona)
绝对回报比您预期的要少得多。
关于persona
,你为什么把它变成一个指针,而不是一个普通的变量?!malloc() 只有在没有其他机会的情况下才应该使用,正是因为使用不当会很危险。
如果我发现更多,我会告诉你。
推荐阅读
- java - Coretto Java 浮点数
- powershell - PowerShell index[0] 到字符串的第一个实例, index[1] 到第二个实例,依此类推,直到完成
- scala - 参考上传的JAR库
- github - GitHub 回溯到上一次推送
- javascript - 如何在另一个函数中调用一个函数
- ibm-mobilefirst - MFP_PERSISTENT_DATA 截断问题
- javascript - 将 UInt8Array 数组转换为 ArrayBuffer 的最有效方法?
- pandas - 使用 pandas 根据其他列中的条件创建一个新的 ID 列
- javascript - 如何检测对话框“在 appName 中打开此页面”中的按钮已被单击
- c++ - C++ 中的 ISSN 格式,空格、布尔函数和数组的问题