我正在尝试在C中创建一个简单的2D数组,但显然遇到了一些内存问题。我的设置很简单,我不知道出了什么问题。我承认我对指针的理解是不够的,但我仍然认为这应该有效。谁能看到这里的缺陷?
typedef unsigned int DATUM;
DATUM **series_of_data;
void initialize_data()
{
*series_of_data = (DATUM *) malloc(1024 * sizeof(DATUM));
}
这会导致我的程序在运行时因总线错误而崩溃。
答案 0 :(得分: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);
}
数据很好地打包在内存中,所以缓存很开心,你保持[] []访问模式。 作为速度问题,这是经典DATUM * +多项式访问方法的+/- 3%速度。
答案 1 :(得分:1)
在分配给series_of_data
之前,您尚未分配*series_of_data
指针。
例如,如果series_of_data
是一个数组,那么你需要写这样的东西:
series_of_data = malloc(n*sizeof(DATUM*));
其中n
是series_of_data
数组的长度。
只有在完成此操作后才能分配到*series_of_data
。
答案 2 :(得分:1)
series_of_data
是无效指针 - 您不会将其指定给任何内容。当你试图分配到它的内存位置(*series_of_data = ...
)时,它会把东西放在一个随机的地方,这可能不会做你想要的。你必须将series_of_data
指向某个有用的地方,例如
series_of_data = (DATUM **)malloc(16 * sizeof(DATUM *))
表示包含16个DATUM *
指针插槽的数组。