2
#pragma pack(push, 1)
typedef struct 
{
      /*...*/
  unsigned int      dataoffset;         //No of bytes before actual pixel data
}HEADER;

typedef struct 
{
   /*...*/
   unsigned int     width;
   unsigned int     height;
   unsigned short   bits_per_pixel;         //code is written for 24 bits only and No other format is supported..
    /*...*/
}INFO_HEADER;

typedef struct 
{
   unsigned char    b;
   unsigned char    g;
   unsigned char    r;        
}COLORMAP;

#pragma pack(pop)


int main()
{
      // Var decl.
  INFO_HEADER       *pHeader = NULL;
  FILE              *pImage;
  COLORMAP          **ppColors;
  /*...*/

/* File opened in read, binary mode, memory allocated for pHeader*/     

fread (pHeader, sizeof(INFO_HEADER), 1, pImage);  

/*Next block is actually problematic.. Posting 'as is' from my code*/
      ppColors = (COLORMAP**)malloc((pHeader -> height ) * sizeof(COLORMAP));
  for(i = 0 ; i < pHeader -> height ; i++)
     ppColors[i] = (COLORMAP*)malloc(pHeader -> width * sizeof(COLORMAP));
fseek(pImage, pHeader -> fileheader.dataoffset, SEEK_SET);
    for (i = 0 ; i < pHeader -> width ; i++) 
  {
      for (j = 0 ; j < pHeader -> height ; j++) 
      {
          fread(&b, sizeof(unsigned char), 1, pImage);
          fread(&g, sizeof(unsigned char), 1, pImage);
          fread(&r, sizeof(unsigned char), 1, pImage);

          ppColors[i][j].b = b;
          ppColors[i][j].g = g;
          ppColors[i][j].r = r; 

          printf("width = %d height = %d %d:\t", i, j,  cnt);
          printf("%d ", (int)ppColors[i][j].b);
          printf("%d ", (int)ppColors[i][j].g);
          printf("%d\n", (int)ppColors[i][j].r);
          cnt++;  
      }
  }

  /*And at last free()ing..*/
  for(i = 0 ; i < pHeader -> height ; i++)        free(ppColors[i]);
   free(ppColors);
  cleanup();
  return(0)
}

重複の可能性http ://stackoverflow.com/questions/1568042/optimal-way-to-free-a-malloced-2d-array-in-c

上記のリンクは私の問題を解決できませんでしたが。

  1. メモリが不足しています。私はheightに対してmalloc()を実行しました。次に、高さごとに、widthが再びmalloc()されます。私は幅X高さドメインのみで作業しようとしています。問題は身長にあるようです。変更した場合

ppColors = (COLORMAP**)malloc((pHeader -> height ) * sizeof(COLORMAP));ppColors = (COLORMAP**)malloc((pHeader -> height + 6 ) * sizeof(COLORMAP));

その後、この問題は解消されます。

  1. しかし、free()を実行すると、コアダンプでダブルフリー/破損が発生します。

私はどこかで間違っていると確信しています。私は誰かが私のコードを修正することを期待しておらず、私はそれを実行するだけです。ヒントだけで十分です。

4

3 に答える 3

3

ポインタへのポインタは、配列の配列と同じではありません。

次の宣言のように、ポインタからポインタを使用して多次元配列をシミュレートする場合:

char **pointer;

メモリは次のようになります。

+ ------------ + ------------ + ----- + ----------------- --+
| ポインタ[0]| ポインタ[1]| ... | ポインタ[サイズ-1]|
+ ------------ + ------------ + ----- + ----------------- --+
     | | |
     vvv
   データデータデータ

適切な多次元配列ながら

char array[X][Y];

メモリ内では次のようになります。

+ ------------- + ------------- + ----- + --------------- -+ ------------- + ----- +
| 配列[0][0]| 配列[0][1]| ... | 配列[0][Y-1]| 配列[1][0]| ... |
+ ------------- + ------------- + ----- + --------------- -+ ------------- + ----- +

したがって、適切な多次元配列では、すべてのメモリが1つのブロックにありますが、ポインタ間を使用すると、配列の配列ではなく、ポインタの配列があります。


したがって、実行する必要があるのは、すべてのサブ配列を個別に割り当てることです。

ppColors = malloc(pHeader->height * sizeof(COLORMAP *));
/* Note how I allocate the width times the size of a COLORMAP pointer */

for (int i = 0; i < pHeader->height; i++)
    ppColors[i] = malloc(pHeader->width * sizeof(COLORMAP));

freeループで呼び出す必要があることを忘れないでください!

于 2013-01-17T13:12:47.237 に答える
2

私はいくつかの問題を見ることができます:

  • ppColorsポインタの配列です。配列内の各要素はCOLORMAP*なので、を使用してmallocされるサイズを計算する必要がありますnumElements * sizeof(COLORMAP*)COLORMAPたった3文字なので、sizeof(COLORMAP*)> sizeof(COLORMAP)。現在の割り当てが小さすぎるため、配列の終わりを超えて書き込むことになります。これには未定義の影響がありますが、クラッシュする可能性があります。
  • 幅と高さの使用は割り当てとループの間で逆になるため、ループのある時点で未割り当てのメモリに書き込むことになります。
于 2013-01-17T13:11:48.630 に答える
1

これは答えではないかもしれませんが、おそらく他の答えと一緒にあなたを助けます。

  • これは、fread何を取得して何を取得するかを確認する際に問題になる可能性がpHeader -> heightありますpHeader -> width

  • で括弧を使用pHeader -> widthしますmalloc(pHeader -> width * sizeof(COLORMAP))

于 2013-01-17T13:17:07.130 に答える