0


行からのデータで構造体を埋めています。行の形式は 3 つの異なる形式である可能性があり
ます
。 ,B "(コンマで区切られた 2 番目の単語)。
instruccion と呼ばれる構造体には、各部分 ( mnemoop1およびop2) を指す 3 つのポインターしかありませんが、2 番目の単語にメモリを割り当てると、1 番目の単語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

主な可能性は 2 つあります。

プログラムの別の場所でメモリを解放しています (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 に答える