微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于malloc,此变量指向什么?

如何解决关于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个存储位置。

出了点问题,但我看不到。我可以得到反馈吗?

enter image description here

#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

,

下面是您要创建的图:

enter image description here

绿色箭头显示使用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 举报,一经查实,本站将立刻删除。