3

C で単純な 2D 配列を作成しようとしていますが、メモリの問題が発生しているようです。私のセットアップは非常にシンプルで、何が悪いのかわかりません。ポインターの理解が不十分であることは認めますが、それでも機能するはずだと思います。誰でもここで欠陥を見ることができますか?

typedef unsigned int DATUM;
DATUM **series_of_data;
void initialize_data()
{
    *series_of_data = (DATUM *) malloc(1024 * sizeof(DATUM));
}

これにより、実行時にプログラムがバス エラーでクラッシュします。

4

3 に答える 3

6

series_of_data は実際には割り当てられていません。

2D 配列を割り当てるにはさまざまな方法があります。キャッシュの一貫性が悪く、通常はパフォーマンスが悪い行モデルの配列を使用するか、1 つの巨大な h*w メモリを割り当てることで構成される C の数値レシピでアドバイスされている Iliffe ベクトルを使用します。ブロックと、行 (または列) の先頭を含むサイド ポインター配列:

DATUM** alloc_array( int h, int w )
{
  int i;
  DATUM** m = (DATUM**)malloc(h*sizeof(DATUM*));
  m[0] = (DATUM*)malloc(h*w*sizeof(DATUM));
  for(i=1;i<h;i++) m[i] = m[i-1]+w;
  return m;
}

void release_array(DATUM** m)
{
  free( m[0] );
  free( m);
}

int main()
{
  int r,c;
  DATUM** tab;
  int width  = 5;
  int height = 3;
  tab = alloc_array(height, width); /* column first */

  for(r = 0;r<height;++r)
   for(c = 0;c<width;++c)
    tab[r][c] = (1+r+c);

  for(r = 0;r<height;++r)
  {
    for(c = 0;c<width;++c)
    {
      printf("%d\t",tab[r][c]);
    }
    puts("");
  }
  release_array(tab);
}

データはメモリにうまく詰め込まれているので、キャッシュは問題なく、[][] アクセス パターンを維持できます。速度の問題として、これは従来の DATUM* + 多項式アクセス方式の +/-3% の速度です。

于 2011-05-05T03:44:49.397 に答える
1

series_of_dataに割り当てる前にポインタを割り当てていません*series_of_data

たとえば、series_of_dataを配列にする場合は、次のように記述する必要があります。

series_of_data = malloc(n*sizeof(DATUM*));

ここで、配列nの長さです。series_of_data

これを行った後でのみ、 に割り当てることができます*series_of_data

于 2011-05-05T03:43:03.780 に答える
1

series_of_dataは無効なポインターです。何にも割り当てません。メモリの場所 ( ) に割り当てようとすると*series_of_data = ...、ランダムな場所にデータが配置されるため、意図したとおりに動作しない可能性があります。series_of_data便利な場所を指す必要があります。

series_of_data = (DATUM **)malloc(16 * sizeof(DATUM *))

DATUM *ポインター用の 16 個のスロットがある配列の場合。

于 2011-05-05T03:43:39.683 に答える