为什么我的2D数组导致C中的总线错误?

Jos*_*zel 3 c memory malloc bus-error

我试图在C中创建一个简单的2D数组,但显然遇到了一些内存问题.我的设置很简单,我不知道出了什么问题.我承认我对指针的理解是不够的,但我仍然认为这应该有效.谁能看到这里的缺陷?

typedef unsigned int DATUM;
DATUM **series_of_data;
void initialize_data()
{
    *series_of_data = (DATUM *) malloc(1024 * sizeof(DATUM));
}
Run Code Online (Sandbox Code Playgroud)

这导致我的程序在运行时遇到总线错误而崩溃.

Joe*_*cou 6

实际上没有分配series_of_data.

您可以通过各种方式分配2D数组,使用行数组模型,因为它具有较差的缓存一致性,因此通常具有较差的性能,或者使用C中的数字配方中建议的Iliffe向量,其中包括分配一个巨大的h*w内存块和包含行(或列)开头的侧指针数组:

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);
}
Run Code Online (Sandbox Code Playgroud)

数据很好地打包在内存中,因此缓存很快乐并保持[] []访问模式.作为速度问题,这是经典DATUM*+多项式访问方法的+/- 3%速度.