3

我正在尝试在 C 中创建一个简单的二维数组,但显然遇到了一些内存问题。我的设置很简单,我不知道出了什么问题。我承认我对指针的理解不足,但我仍然认为这应该是可行的。任何人都可以看到这里的缺陷吗?

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 数组,或者使用具有不良缓存一致性并因此通常具有不良性能的行模型的数组,或者使用在 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*));

其中nseries_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 *))

对于一个有 16 个指针槽的数组DATUM *

于 2011-05-05T03:43:39.683 回答