gpt4 book ai didi

c - 关于 malloc,这个变量指向什么?

转载 作者:行者123 更新时间:2023-12-04 15:15:58 25 4
gpt4 key购买 nike

目前我正在学习指针。

   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 个位置来存储 double 。所以需要跳过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,j,k,mat3[i][j][k]);

exit(0);
}

最佳答案

下面是您尝试创建的图表:

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;

关于c - 关于 malloc,这个变量指向什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64321763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com