2017-01-10 9 views
1

私はANSI形式のファイルを読み込むしようとしているとbinary.I'mに、この変換は、このような2つの動的メモリ割り当て宣言:char* binary_reverse = new char;char * binary = new char;新宣言は、ごみ値とヒープの破損を含むされ

しばらく私はこの(バイナリ)にはゴミ値が多すぎることがわかります。それはなぜそうですか?

私はこれらのように削除しています:delete binary_reverse;バイナリを削除する。 しかし、中にその私に与えてエラーを削除します。

ここ

'ASCIItoBinary.exe': Loaded 'D:\TryingBest\Reactice\ASCIItoBinary\Debug\ASCIItoBinary.exe', Symbols loaded. 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file 'ASCIItoBinary.exe': Loaded 'C:\Windows\SysWOW64\msvcr100d.dll', Symbols loaded. HEAP[ASCIItoBinary.exe]: Heap block at 00241ED0 modified at 00241EFD past requested size of 25 Windows has triggered a breakpoint in ASCIItoBinary.exe.

は、私は、コードをやっている方法です:

#include <cstring> 

void AtoB(char * input) 
{ 
    unsigned int ascii; //used to store ASCII number of a character 
    unsigned int length = strlen(input); 
    //cout << " "; 
    for (int x = 0; x < length; x++) //repeat until the input is read 
    { 
     ascii = input[x]; 
     char* binary_reverse = new char;  //dynamic memory allocation 
     char * binary = new char; 
     //char binary[8]; 
     int y = 0; 
     while (ascii != 1) 
     { 
      if (ascii % 2 == 0) //if ascii is divisible by 2 
      { 
       binary_reverse[y] = '0'; //then put a zero 
      } 
      else if (ascii % 2 == 1) //if it isnt divisible by 2 
      { 
       binary_reverse[y] = '1'; //then put a 1 
      } 
      ascii /= 2; //find the quotient of ascii/2 
      y++; //add 1 to y for next loop 
     } 
     if (ascii == 1) //when ascii is 1, we have to add 1 to the beginning 
     { 
      binary_reverse[y] = '1'; 
      y++; 
     } 

     if (y < 8) //add zeros to the end of string if not 8 characters (1 byte) 
     { 
      for (; y < 8; y++) //add until binary_reverse[7] (8th element) 
      { 
       binary_reverse[y] = '0'; 
      } 
     } 

     for (int z = 0; z < 8; z++) //our array is reversed. put the numbers in the rigth order (last comes first) 
     { 
      binary[z] = binary_reverse[7 - z]; 
     } 
     //printf("the Binary is %s",binary); 
     //cout << binary; //display the 8 digit binary number 

     delete binary_reverse;  //free the memory created by dynamic mem. allocation 
     delete binary; 
    } 
} 

は、私が「バイナリ」の正確なバイナリ値を求めています。ガベージに加えてバイナリの値ではない?ガベージの値を取り除く方法は?ヒープの破損を避けるには?

+1

'char * binary_reverse = new char; 'と' char * binary = new char; ' - あなたが記憶のために1バイトを割り当てます。 – RbMm

+0

トピックから:少しのコードを保存してください:' else if(ascii%2 == 1) 'はちょうど' else'です。 1つのバイナリビットを扱う場合、値は1または0のいずれかになります。それが1でなければ、それは他方でなければなりません。 – user4581301

答えて

1

問題は、new charコマンドで1文字しか割り当てられていないことです。 new char[9]を使用して、さらに割り当てる必要があります。あなたは最大8ビットを出力しているので、ヌルターミネータには1つの余分な文字が必要です。文字列の末尾には必ずbinary_reverse[y]=0を設定してください。

deleteの代わりにdelete[]を入力します。

しかし、それは言った、あなたは...代わりに

+0

私はこれを試しました。新しいchar [8]とdelete []のように、同じ問題が残っています – AskMe

+0

投稿した内容はうまくいかないので、作業のチャンスがある(つまり、新しいchar [8]で)投稿してください。 –

+0

私は答えを更新しました。文字列の最後にヌルターミネータが必要です。 –

1

std::stringstd::vectorを使用する必要がありますが判明間違ったことの束がここにありますほとんどすべての出力文字列を終了した後、OFFF見出していないから幹間違った方向に修正を探しています。

私は

OPは、より多くのストレージを必要と言って以外

でエラーを無視するつもりです。

char* binary_reverse = new char[8]; 

正しいアプローチはOPが使用を開始し、文字列のNULL終端を含むように、余分なバイトを追加するように見える一時的な配分に戻って行くことです。そして、そのスペースをヌルターミネータに使用します。

ヌルターミネータがないと、文字列がありません。あなたはバイナリブロブを持っています。印刷ルーチン、すべてのCスタイルの文字列ルーチンは、そこにある終端文字をカウントします。それがなければ、文字列の終わりがわからず、それを探している野生の青い奴隷に向かう。多くの場合、悪いことが起こります。あるいはそうではないかもしれない。あなたが配列の外側を歩いているときに起こることは定義されていません。たぶんそれはあなたが望むことをするでしょう。多分それはしません。確かな方法はありません。この場合、軌道からサイトをヌクリングしても機能しません。

だから一時ストレージを割り当てる:binary_reverseを構築し、その後binaryに転送された後、

char binary_reverse[8]; // not using this one like a string so we don't need a terminator 
char binary[9]; // printing this one. Need a terminator to know when to stop printing. 

その後、binary文字列だけではなく、別の匿名のバイナリブロブになるために終了する必要があります。

binary[8] = '\0'; 

これで印刷できます。

推奨事項:

Visual Studioの素晴らしいデバッガを持っています。それに精通してください。それはあなたに多くの時間を節約します。

OPが印刷文をコメントアウトしていなかった場合、オッズは良好です。昨晩の主なバグは誰かが見つけたでしょう。コードの最小化は良いですが、OPはバグの目に見える表現を削除しました。

このコードは劇的に簡略化できます。あなたはasciiで作業しているので、8ビットが必要だと知っています(実際はasciiは7ビットですが、もう8ビット以外のものは見られません)。 while (ascii != 1)for (int count = 0; count < 8; count++)にして、文字の8ビットすべてをテストします。後であなたはいつも8ビットを取得するので、カップルのループを保存します。

+0

まだ両方の問題を取得しています。誰もがVSで同じ書き込みを試み、正常に実行できますか? – AskMe

+0

@TryingBest回答の合計再書き込み。 – user4581301

関連する問題