如何解决关于malloc,此变量指向什么?
目前我正在学习指针。
mat3 = (double***) malloc(m*sizeof(double**));
此语句表明mat3指向两个包含double **的数组中的第一个数组。
mat3[0] = (double**) malloc(m*n*sizeof(double*));
我做了一个小图以显示我的看法。我不明白为什么带有注释的行是错误的。我认为与上述情况相同。
for (i=0; i<m; i++)
{
mat3[i] = mat3[0] + i*n;
for(j=0; j<n; j++)
{
mat3[i][j] = mat3[i][0] + j*p; // this goes wrong
}
}
在第一个循环中,获取第一个**数组的地址,并添加每次迭代3。该图还显示存在3 *数组,因此看起来不错。
在第二个循环中,获取第一个*数组的地址,并添加每次迭代4。因为每个*数组都包含4个存储双精度字的地方,所以这看起来还不错。因此需要跳过4个存储位置。
出了点问题,但我看不到。我可以得到反馈吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
double*** mat3;
int m,n,p;
int i,j,k;
m=2; n=3; p=4;
printf("This program causes a coredump,unless you fix the error in it !\n");
mat3 = (double***) malloc(m*sizeof(double**));
if (mat3 == NULL)
exit(1);
mat3[0] = (double**) malloc(m*n*sizeof(double*));
if (mat3[0] == NULL)
exit(1);
mat3[0][0] = (double*) malloc(m*n*P*sizeof(double));
if (mat3[0][0] == NULL)
exit(1);
for (i=0; i<m; i++)
{
mat3[i] = mat3[0] + i*n;
for(j=0; j<n; j++)
{
mat3[i][j] = mat3[i][0] + j*p; // this goes wrong
}
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(k=0;k<p;k++)
mat3[i][j][k] = i + 10*j + 100*k;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(k=0;k<p;k++)
printf("mat3[%d][%d][%d] = %lf\n",i,k,mat3[i][j][k]);
exit(0);
}
解决方法
考虑如何初始化每个指针以及哪个指针指向哪个对象。
像这样开始。在 mat3 = malloc(m*sizeof(double**));
之后,mat3
指向长度为6的数组,其元素指针指向double
的指针。
mat3 (double ***)
|
V
+----+----+
| | | (double **) //uninitialized
+----+----+
在下一个malloc()
之后,情况有所不同。
mat3 (double ***)
|
V
+----+----+
| | | (double **) //uninitialized except element 0
+----+----+
|
V
+----+----+----+----+----+----+
| | | | | | | (double *) //uninitialized
+----+----+----+----+----+----+
继续此图并为每个更改绘制一个(只是原理,不需要为24个double
绘制所有24个框)。当指针设置为错误的值时,您会知道错误在哪里以及如何修复它。
在考虑了一会儿之后,我知道问题出在哪里,以及如何解决它,但是您应该学会自己解决这个问题。
非主题:数组索引永远不能为int
类型,对于正值,请使用size_t
;当需要与负索引一起使用的代码时,请使用ptrdiff_t
。
下面是您要创建的图:
绿色箭头显示使用malloc
调用初始化的3个指针。
红色箭头显示此时尚未初始化的6个指针。
因此3 malloc
之后的代码必须在使用所有红色指针之前对其进行初始化。而且您的代码无法做到这一点。
第mat3[i] = mat3[0] + i*n;
行将初始化mat3[1]
。
然后,行mat3[i][j] = mat3[i][0] + j*p;
在坚硬的一面使用mat3[0][0]
和mat3[1][0]
。使用mat3[0][0]
很好,因为已经被初始化,但是使用mat3[1][0]
不好,因为它没有被初始化。
更改
mat3[i][j] = mat3[i][0] + j*p;
到
mat3[i][j] = mat3[0][0] + i*n*p + j*p;
,
如果我错了,请纠正我,但是
sizeof(double*),sizeof(double**),sizeof(double***),sizeof(double****)
...,
返回相同的字节数(支持的内存地址大小)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。