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

为什么我的2D数组在C中会导致总线错误?,c,memory,malloc,bus-error,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)); } 这会导致我的程序在运行时由于总线

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

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

这会导致我的程序在运行时由于总线错误而崩溃。

在分配给
*series\u of_data
之前,您尚未分配
series\u of_data
指针

例如,如果
series\u of_data
是一个数组,那么您需要编写如下内容:

series_of_data = malloc(n*sizeof(DATUM*));
其中,
n
是数据数组的
系列的长度


只有在完成此操作后,才能将
*系列\u数据

系列\u数据
指定为无效指针-您不会将其指定给任何对象。当您试图分配给它的内存位置(
*series\u of_data=…
)时,它会将内容放在一个随机的位置,这很可能不符合您的要求。您必须将数据系列指向有用的地方,例如

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

对于包含16个插槽用于
数据*
指针的数组。

系列\u数据实际上未分配

分配2D数组的方法多种多样,既可以使用缓存一致性差因而通常性能差的行数组模型,也可以使用C中数值公式中建议的Iliffe向量,该向量包括分配一个巨大的h*w内存块和一个包含行(或列)开头的侧指针数组:

DATUM**alloc_数组(int h,int w)
{
int i;
基准**m=(基准**)malloc(h*尺寸(基准*);
m[0]=(基准*)malloc(高*宽*尺寸(基准));

对于(i=1;非常可爱..你真的在5分钟内写出来了吗?这是我经常使用的东西,所以我很方便;)这很好,但没有直接解决我的问题(总线错误).+1您有一个总线错误,因为您没有分配数据**,请参阅我文章的开头:)双指针不是2D数组。这样使用它们是非常低效和愚蠢的,除非您想利用在O(1)而不是O(cols)中排列行的可能性。只需使用一个指针并通过乘法对行和列进行寻址,或使用指向vla类型的指针(但后一种用法很难正确,C99特定,可能不值得)。顺便说一句,您不应该从malloc强制转换返回值。
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);
}