gpt4 book ai didi

c - 使用 malloc 的二维矩阵无法分配正确的值

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

抱歉,我对 c 比较陌生,正在尝试使用 malloc 创建两个二维数组。有人告诉我,这种方法在计算上比通过 for 循环创建数组的指针数组(对于大型数组)更有效。

int i, j;
double **PNow, **PNext, *Array2D1, *Array2D2;

//Allocate memory
PNow = (double**)malloc(3 * sizeof(double*));
PNext = (double**)malloc(3 * sizeof(double*));
Array2D1 = (double*)malloc(5 * sizeof(double));
Array2D2 = (double*)malloc(5 * sizeof(double));

//Create 2-Dimensionality
for(i = 0; i < 3; i++)
{
PNow[i] = Array2D1 + i * 5;
PNext[i] = Array2D2 + i * 5;
};


//Define Element Values
for(i = 0; i < 3; i++)
{
for(j = 0; j < 5; j++)
{
PNow[i][j] = 10.*(i + j);
PNext[i][j] = 1000.*(i + j);
};
};


//Output two matrices side-by-side.
for(i = 0; i < 3; i++)
{
for(j = 0; j < 5; j++)
{

printf("%6lg", PNow[i][j]);
if(j == 4)
{
printf("|");
};
};
for(j = 0; j < 5; j++)
{

printf("%6lg", PNext[i][j]);
if(j == 4)
{
printf("\n");
};
};
};

我的问题是,第一个矩阵 (PNow) 结果如我所料,但由于某种原因,PNext 中的一半值是 PNow 的值,我一生都无法弄清楚为什么会这样做这个?我显然错过了一些东西..另外,我不太清楚“Array2D1 + i*5”在做什么以及这如何使 PNow 成为二维数组?

任何帮助将不胜感激。谢谢。

附注这是我得到的输出,所以你可以明白我的意思:

 0    10    20    30    40|    20    30    40    50    20
10 20 30 40 50| 30 40 50 60 5000
20 30 40 50 60| 2000 3000 4000 5000 6000

最佳答案

在 C 中,您不会强制转换 malloc 的结果,因此您的 malloc 行应为

PNow = malloc(3*sizeof(double*));

您的问题是您实际上没有在 Array2D1 和 Array2D2 中分配足够的内存。当您越过数组中的第一“行”时,您就超出了分配的内存!所以你处于未定义的行为领域。在你的例子中,看起来你的两个矩阵相互重叠(尽管我的测试只是抛出一个错误)。您可以通过两种方式解决此问题:

在 malloc 中指定矩阵的完整大小并按照您的操作进行操作:

Array2D1 = malloc(15*sizeof(double));
Array2D2 = malloc(15*sizeof(double));

或者 malloc for 循环中的每一行:

for(i=0; i<3; i++){
PNow[i] = malloc(5*sizeof(double));
PNext[i] = malloc(5*sizeof(double));
}

编辑:关于每个示例中的释放主题

对于第一个示例,释放很简单

free(PNow);
free(PNext);
free(Array2D1);
free(Array2D2);

对于第二个,您必须遍历每一行并单独释放

for (i = 0; i < 3; i++) {
free(PNow[i]);
free(PNext[i]);
}

Edit2:实际上,如果您要使用预处理器宏对行和列进行硬编码,则根本没有理由进行 malloc。您可以简单地执行以下操作:

#define ROW 3
#define COL 5

double PNow[ROW][COL], PNext[ROW][COL];

Edit3:至于Array2D1 + i * 5在做什么,PNow是一个指针数组,Array2D1是一个指针。通过添加 i * 5,您可以将指针增加 i * 5(即,说“给我一个指向内存的指针,即 i * 5Array2D1 不同)。因此,您将使用指向行的适当大小的内存块的开头的指针填充 PNow

关于c - 使用 malloc 的二维矩阵无法分配正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37625971/

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