我用一行数据填充结构,行格式可以是3种不同的形式:
1 .-“LD”(只需一个字)
2 .-“LD A”(仅2个字)
3.-“LD A,B”(第二个单词以昏迷分隔)
名为instruccion的结构只有3个指针指向每个部分(mnemo
,op1
和op2
),但是当为第二个单词分配内存时,有时malloc
会返回相同的内容为第一个单词给出的值。以下是mallocs
指向的代码:
instruccion sepInst(char *linea){
instruccion nueva;
char *et;
while(linea[strlen(linea)-1]==32||linea[strlen(linea)-1]==9)//Eliminating spaces and tabs at the end of the line
linea[strlen(linea)-1]=0;
et=nextET(linea);//Save the direction of the next space or tab
if(*et==0){//If there is not, i save all in mnemo
nueva.mnemo=malloc(strlen(linea)+1);
strcpy(nueva.mnemo,linea);
nueva.op1=malloc(2);
nueva.op1[0]='k';nueva.op1[1]=0;//And set a "K" for op1
nueva.op2=NULL;
return nueva;
}
nueva.mnemo=malloc(et-linea+1);<-----------------------------------
strncpy(nueva.mnemo,linea,et-linea);
nueva.mnemo[et-linea]=0;printf("\nj%xj",nueva.mnemo);
linea=et;
while(*linea==9||*linea==32)//Move pointer to the second word
linea++;
if(strchr(linea,',')==NULL){//Check if there is a coma
nueva.op1=malloc(strlen(linea)+1);//Do this if there wasn't any coma
strcpy(nueva.op1,linea);
nueva.op2=NULL;
}
else{//Do this if there was a coma
nueva.op1=malloc(strchr(linea,',')-linea+1);<----------------------------------
strncpy(nueva.op1,linea,strchr(linea,',')-linea);
nueva.op1[strchr(linea,',')-linea]=0;
linea=strchr(linea,',')+1;
nueva.op2=malloc(strlen(linea)+1);
strcpy(nueva.op2,linea);printf("\n2j%xj2",nueva.op2);
}
return nueva;
}
当我打印指针时,它恰好是相同的数字。 注意:函数char * nextET(char * line)返回行中第一个空格或制表符的方向,如果没有则返回行尾的方向。
在程序中多次调用 sepInst()
,并且只有在多次调用它之后才开始失败。我所有程序中的这些mallocs
让我头疼不已。
答案 0 :(得分:1)
主要有两种可能性。
要么将程序中的其他内存释放(搜索free
或realloc
的来电)。在这种情况下,您看到的效果是完全良性的。
或者,您可能正在遭受内存损坏,很可能是缓冲区溢出。短期治愈是使用专门的工具(memory debugger)。选择您平台上可用的一个。该工具将需要重新编译(重新链接),并最终告诉您代码在何处超出先前定义的缓冲区限制。可能存在多个违规代码位置。将每一个视为严重缺陷。
一旦你厌倦了这种研究,学习使用const
限定符并将其与所有变量/参数声明一起使用,你可以干净利落地完成它。这不能完全防止缓冲区溢出,但它会将它们限制为可写缓冲区的变量(例如,那些涉及你的问题的缓冲区显然不是)。
答案 1 :(得分:0)
另一方面,我个人认为你应该更加努力地减少对malloc的召唤。这对性能来说是一个好主意,也会导致腐败减少。
nueva.mnemo=malloc(strlen(linea)+1);
strcpy(nueva.mnemo,linea);
nueva.op1=malloc(2);
应该是
// strlen has to traverse your string to get the length,
// so if you need it more than once, save its value.
cbLineA = strlen(linea);
// malloc for the string, and the 2 bytes you need for op1.
nueva.mnemo=malloc(cbLineA + 3);
// strcpy checks for \0 again, so use memcpy
memcpy(nueva.mnemo, linea, cbLineA);
nueva.mnemo[cbLineA] = 0;
// here we avoid a second malloc by pointing op1 to the space we left after linea
nueva.op1 = nueva.mnemo + cbLinea + 1;
每当你可以通过预先计算来减少malloc的数量....做吧。你正在使用C!这不是滥用堆或垃圾收集的高级语言!