本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSC]64Kバイト以上の配列を使ったqsort関数の不具合

文書番号: 402055

最終更新日: 1999/08/19


この資料は以下の製品について記述したものです。


この記事は、以前は次の ID で公開されていました: JP402055

概要

この資料は、qsort 関数を実行した時に、結果の配列に空のデータが含まれることが ある現象について説明したものです。

詳細

64K バイト以上のある大きさを持つ二次元配列にたいして qsort 関数を実行した場合 に結果の配列に空のデータが含まれることがあります。

再現プログラム

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #define ELM 36
  #define TBL ((0xffff / ELM) + 1)
  char tbl_key[TBL][ELM];
  //struct table{ char key[ELM]; }tbl_key[TBL];             //  対策
  int cmpf(const void *c1,const void *c2);
  void main(void)
  {
      int i;
      printf("Table[%d][%d] data(0x%lxbyte).\n",TBL,ELM,(long)TBL*(long)ELM);
      for(i = 0;i < TBL;i++){
          sprintf(tbl_key[i],"%6d\n",rand());
  //      sprintf(tbl_key[i].key,"%6d\n",rand());          //  対策
          if(tbl_key[i][0] == '\0'){
  //      if(tbl_key[i].key[0] == '\0'){                   //  対策
              printf("tbl_key[%d] is empty.\n",i);
          }
          if(i < 5){
              printf("%s",tbl_key[i]);
  //          printf("%s",tbl_key[i].key);                 //  対策
          }
      }
      qsort( (void*)tbl_key, (size_t)TBL, (size_t)ELM, cmpf );
  //  qsort( (void*)tbl_key, (size_t)TBL, sizeof(struct table), cmpf ); //対策
      printf("********************\n");
      for(i = 0;i < TBL;i++){
          if(tbl_key[i][0] == '\0'){
  //      if(tbl_key[i].key[0] == '\0'){                   //  対策
              printf("tbl_key[%d] is empty.\n",i);
          }
          if(i < 5){
              printf("%s",tbl_key[i]);
  //          printf("%s",tbl_key[i].key);                 //  対策
          }
      }
      printf("Sort End.\n");
  }
  int cmpf(const void *c1,const void *c2)
  {
      return strcmp(c1,c2);
  //  return strcmp(((struct table*)c1)->key,((struct table*)c2)->key); //対策
  }

原因

qsort 関数の障害です。

対処方法

ヒュージデータを qsort 関数でソートする場合は、二次元配列を構造体配列に書き換え てください。
再現プログラムのコメントになっている //対策 の行を参考にしてください。

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: KBBUG KB402055
Technology: kbAudDeveloper kbCCompPDS600DOS kbCCompSearch kbvc150 kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system