两个malloc返回相同的指针值

时间:2012-05-27 19:20:17

标签: c malloc

我用一行数据填充结构,行格式可以是3种不同的形式:
1 .-“LD”(只需一个字)
2 .-“LD A”(仅2个字)
3.-“LD A,B”(第二个单词以昏迷分隔) 名为instruccion的结构只有3个指针指向每个部分(mnemoop1op2),但是当为第二个单词分配内存时,有时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让我头疼不已。

2 个答案:

答案 0 :(得分:1)

主要有两种可能性。

要么将程序中的其他内存释放(搜索freerealloc的来电)。在这种情况下,您看到的效果是完全良性的。

或者,您可能正在遭受内存损坏,很可能是缓冲区溢出。短期治愈是使用专门的工具(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!这不是滥用堆或垃圾收集的高级语言!