无法为三重指针分配内存

时间:2020-06-03 12:27:38

标签: c arrays pointers malloc heap

我正在为一个学校做项目,但遇到了一个问题,我不知道该如何解决。我试图在一个函数中为三重指针分配内存,这样我就可以将其用作2D数组,保存数据,然后在其他函数中使用它。但是由于某种原因,一旦我退出功能,就无法使用数据。

顺便说一句,我必须使用在函数(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]);

1 个答案:

答案 0 :(得分:0)

此:

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);
}

不应原样循环。

要么 将声明移到循环上方,然后在循环中使用索引值(即Matrix2[i][j])代替ROWS, COLS,< / p>

float Matrix1[ROWS][COLS] = {0};
float Matrix2[ROWS][COLS] = {0};

//Note: these initializers work only for 3x3 array
//Forcing ROWS == 3 and COLS == 3
float data1[ROWS][COLS] = { {cos(Angle1[0]),-sin(Angle1[1]),L1*cos(Angle1[2])},{sin(Angle1[0]),cos(Angle1[1]),L1*sin(Angle1[2])},{0,0,1} };
float data2[ROWS][COLS] = { {cos(Angle2[0]),-sin(Angle2[1]),L2*cos(Angle2[2])},{sin(Angle2[0]),cos(Angle2[1]),L2*sin(Angle2[2])},{0,0,1} };
 ...
 if(Results)
 {
     for (i = 0; i < 1; i++) 
     {
        Matrix1[i][j] = data1[i][j];
        Matrix2[i][j] = data2[i][j];
        ...
        mat_mul(&Matrix1, &Matrix2, &Results);
     }

...或 完全删除for循环,并将ij的索引从Angle1[i]修改为-编码值,例如:Angle1[0], Angle1[1],...,以便初始化程序将填充2D数组。

float Matrix1[ROWS][COLS] = { {cos(Angle1[0]),-sin(Angle1[1]),L1*cos(Angle1[2])},{sin(Angle1[0]),cos(Angle1[1]),L1*sin(Angle1[2])},{0,0,1} };
float Matrix2[ROWS][COLS] = { {cos(Angle2[0]),-sin(Angle2[1]),L2*cos(Angle2[2])},{sin(Angle2[0]),cos(Angle2[1]),L2*sin(Angle2[2])},{0,0,1} };
mat_mul(&Matrix1, &Matrix2, &Results);

关于创建内存 ,代码中没有任何内容表示需要3D阵列。如评论所述,在float ***C函数原型中mat_mul(., ., float ***C)的原因是为了适应传递2D矩阵(例如&Results)的地址调用函数,以便可以对其进行修改。即使这样,将为该变量创建内存所需的逻辑移到其自己的函数中,并在 作为变量传递之前分配内存是一种改进:

 float **Results = Create2D(COLS, ROWS);
 if(Results)
 {
     for (i = 0; i < 1; i++) 
     {
        ...
        ...
        mat_mul(&Matrix1, &Matrix2, &Results);
     }
     //When finished using, free Results
     free2D(Results, COLS)

函数Create2D()及其伴侣可以实现为:

float ** Create2D(int c, int r)
{   
    float **arr;
    int    y;

    arr   = calloc(c, sizeof(float *));
    for(y=0;y<c;y++)
    {
        arr[y] = calloc(r, sizeof(float));    
    }
    return arr;
}

void free2D(float **arr, int c)
{
    int i;
    for(i=0;i<c;i++)
    {
        free(arr[i]);
    }
    free(arr);
}