1
  • OS:Windows Vista(x86)
  • コンパイラ: コード::ブロック

現在、指定されたディレクトリを開いてその内容を読み取るプログラムを作成しています。printf() を使用して、ファイル名が見つかった直後にファイル名を表示するのではなく。私はそれらを記憶にとどめておき、後で表示します。次の if ステートメントを使用して、メモリの再割り当てをトリガーします。関連する変数の宣言も含めました。

//Represents what the new index will be after the current file name is added
//to 'stack.ptr'
#define NEW_INDEX (stack.index+(strlen(ptr_dirent->d_name)))

//Contains the pointer that points to the directory's contents 'stack.ptr',
//the size of 'stack.ptr' which is 'stack.size', and the current index
//'stack.index'
struct stack
{
  int index;
  char *ptr;
  int size;
};struct stack stack;

//Sets the index to 0 and allocates 256 bytes of memory for 'stack.ptr'
stack.index = 0; stack.size = 256;
stack.ptr = malloc(sizeof(char)*stack.size);

if(NEW_INDEX > stack.size)
{
  char *temp; stack.size *= 2;
  temp = realloc(stack.ptr, sizeof(char)*stack.size);
  if (temp == NULL)
  {
    printf("ERROR: %i Bytes of memory could not be allocated.\n", stack.size);
    free(stack.ptr); closedir(dirp); return '\000';
  }
  else {stack.ptr = temp;}
}

「stack.size」(配列サイズ) の初期値を 256 ではなく 2 に設定するまで、プログラムは完全に機能します (プログラムがメモリを再割り当てするようにします)。realloc() が NULL を返したため、プログラムがクラッシュしましたが、十分なメモリが利用可能でした。「stack.size」がクラッシュしたときに 16 だったので、realloc() が数回動作したことがわかっています (「stack.size」は、メモリが再割り当てされるたびに 2 倍になります)。「stack.size」をいくつかの異なる値に設定しようとしましたが、「stack.size」を 1 または 2 に設定するとクラッシュが発生し、「stack.size」が 16 に達すると常に発生することがわかりました。 ? 「stack.size」を 256 に設定しても、ディレクトリがメモリの再割り当てをトリガーするのに十分な大きさである場合、プログラムがクラッシュする可能性があるのではないかと心配しています。また、関係のないメモで、その openddir("."); を読みました。現在のディレクトリを開きますが、何らかの理由で現在のディレクトリ内のすべてのファイルが「stack.ptr」および. 「stack.ptr」の内容をstdoutに出力すると、..と..が表示されます。

4

1 に答える 1

3

バグを含む行を見せてくれませんでした。おそらく次のようになります。

strcpy(stack.ptr+stack.index, ptr_dirent->d_Name);

ここでの問題は、バイトをstrcpy()コピーすることです。strlen() + 1割り当てられた配列の末尾を超えて終端の NUL char を書き込んでいます。

于 2012-12-18T20:36:43.120 に答える