2012-05-27 63 views
0

我從線填充數據的結構,該行格式可以是3種不同的形式:
1 .-「LD‘(只是一個字)
2 .-’LD A「(只有2個字)
3.-」LD A,B「(第二個字由昏迷分隔)。
稱爲instruccion的結構只有3個指針指向每個部分(mnemo,op1op2),但是當爲第二個字分配內存時,有時malloc會返回與第一個單詞相同的值。下面是與mallocs代碼指出:2 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

對於SO問題,這是太多的代碼。請構建一個10行[最小測試用例](http://sscce.org),最好用英文... –

+0

對不起,我不知道如何做一個小例子,因爲我不知道到底在哪裏在功能上的問題,但我翻譯的意見是英文 –

+0

開始刪除所有不必要的東西(刪除它們後的所有行,你仍然觀察到你在你的問題中提到的相同的行爲)。 – betabandido

回答

1

有兩種主要的可能性。

您可以在程序的其他位置釋放內存(搜索對freerealloc的調用)。在這種情況下,您看到的效果完全是良性的。

或者,您可能正在遭受內存損壞,很可能是緩衝區溢出。短期治療是使用專門的工具(一個memory debugger)。選擇一個在您的平臺上可用的。該工具需要重新編譯(重新鏈接),並最終告訴你代碼的位置超出了以前定義的緩衝區限制。可能有多個違規代碼位置。把每一個都視爲一個嚴重的缺陷。

一旦厭倦了這類研究,請學習使用const限定符,並將其與所有可以乾淨地完成的變量/參數聲明一起使用。這不能完全防止緩衝區溢出,但它會將它們限制爲意圖成爲可寫緩衝區的變量(例如,那些涉及您問題的顯然不是)。

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; 

每當你可以減少預先計算mallocs數量....做到這一點。你正在使用C!這不是一些濫用堆的高級語言或垃圾收集!