【发布时间】:2014-03-25 03:07:50
【问题描述】:
通常人们将矩阵动态分配为
double **A;
int N,i,j;
N=10;
A = (double **)malloc(N*sizeof(double *));
for(i=0; i<N; i++)
{
A[i]= (double *)malloc(N*sizeof(double ));
}
根据课堂上的一些讨论,我了解到这对于大型矩阵不是很有效。这会创建一个指向分配在内存中不同位置的数组的指针数组,在这种分配中更改行的成本更高。所以导师建议使用这种分配方式:
double *A;
int N;
N=10;
A = (double *)malloc(N*N*sizeof(double));
通过查看 A[N*i + j] 来访问矩阵的 i,j 元素。我想像这样分配我的矩阵,但我想保留我的旧符号 A[i][j]。因此,我想到的一种方法是首先进行错误分配,即创建 double** A,如第一部分所述。然后设置
A = (double **)malloc(N*sizeof(double *));
temp = (double *)malloc(N*N*sizeof(double ));
for(i=0; i<N; i++)
{
A[i]=&temp1[i*N+j];
}
这段代码似乎可以工作,但我只知道内存分配的基础知识,所以我想问一下这种分配是否有任何问题,与仅仅保持数组 temp1 有什么不同。谢谢
【问题讨论】:
-
@Quest 这不是重复的。
-
是的,这个线程不是关于每个元素的地址分配到哪里。但是尽管我意识到我的代码中有一个愚蠢的错误,但我不知道它是如何运行的,但这不是真的。
-
问题是
j没有初始化所以你设置随机地址...但是如果j是0或者你在初始化中省略了j这个词,那么你应该没问题.一些编译器在指向数组的指针方面存在问题——这可能是您的 Tiny C 编译器不能很好地处理建议的解决方案的原因。