【发布时间】:2020-09-22 03:38:22
【问题描述】:
我正在为学校做一个项目,但我遇到了一个问题,我不知道如何解决它。我正在尝试为函数中的三重指针分配内存,我将能够将其用作二维数组,保存数据然后在不同的函数中使用它。但是由于某种原因,一旦我退出该功能,我就无法使用这些数据。
顺便说一句,我必须使用函数中写入的变量 (float m1[ROWS][COLS], float m2[ROWS][COLS], float ***C).
int mat_mul(float m1[ROWS][COLS], float m2[ROWS][COLS], float ***C)
{
int i, j, k;
C = (float ***)malloc(sizeof(float*) * 3);
for (i = 0; i < 3; i++) {
C[i] = (float **)malloc(sizeof(float*) * 3);
for (j = 0; j < 3; j++) {
C[i][j] = (float *)malloc(sizeof(float) *3);
}
}
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
(*C)[i][j] = 0;
for (k = 0; k < ROWS; k++) {
(*C)[i][j] += m1[i][k] * m2[k][j];
}
}
}
printf_s("%.1f\n", (*C)[0][0]);
}
int i,j;
float Results[ROWS][COLS];
float Angle1[6], Angle2[6];
Angle_Reader("data_q.csv", &Angle1, &Angle2);
Angle_Converter(&Angle1, &Angle2);
for (i = 0; i < 1; i++) {
float Matrix1[ROWS][COLS] = { {cos(Angle1[i]),-sin(Angle1[i]),L1*cos(Angle1[i])},{sin(Angle1[i]),cos(Angle1[i]),L1*sin(Angle1[i])},{0,0,1} };
float Matrix2[ROWS][COLS] = { {cos(Angle2[i]),-sin(Angle2[i]),L2*cos(Angle2[i])},{sin(Angle2[i]),cos(Angle2[i]),L2*sin(Angle2[i])},{0,0,1} };
mat_mul(&Matrix1, &Matrix2, &Results);
}
printf_s("\n");
printf_s("%.1f\n", Results[0][0]);
【问题讨论】:
-
欢迎来到 SO。你为什么想做这个?如果你的参数列表中有一个三重指针,它可能是一个输出参数,你可以在其中放置一个双指针。在函数中分配三重指针没有意义。它在该函数之外是不可见的。
-
当您调用
mat_mul时,您不需要使用数组的地址。仅名称就已经衰减为指针。无论如何,第三个参数都会被忽略,因为您会立即丢弃C并替换为新分配的地址。 -
我同意现有的 cmets,显示的代码中没有任何内容需要为 3D 矩阵 创建空间。对此的建议,以及下面回答中提供的其他问题。
-
不要强制转换 malloc 返回的值。
标签: arrays c pointers malloc heap-memory