0

我正在用一行中的数据填充结构,行格式可以是 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我所有程序中的这些都让我很头疼。

4

2 回答 2

1

有两种主要的可能性。

要么您正在程序中的其他地方释放内存(搜索对free或的调用realloc)。在这种情况下,您看到的效果是完全良性的。

或者,您可能正遭受内存损坏,很可能是缓冲区溢出。短期治疗是使用专门的工具(内存调试器)。选择一个在您的平台上可用的。该工具将需要重新编译(重新链接)并最终告诉您代码超出先前定义的缓冲区限制的确切位置。可能有多个违规代码位置。把每一个都当作一个严重的缺陷。

一旦你厌倦了这种研究,学习使用const限定符并将它与所有变量/参数声明一起使用,你可以干净地做到这一点。这不能完全防止缓冲区溢出,但会将它们限制为旨在成为可写缓冲区的变量(例如,您的问题中涉及的那些显然不是)。

于 2012-05-27T19:50:33.563 回答
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! 这不是滥用堆或进行垃圾收集的高级语言!

于 2012-05-28T19:20:55.063 回答