无法为三指针分配内存。

问题描述 投票:0回答:1

我正在为学校做一个项目,我有一个问题,我不知道如何解决它。我试图在一个函数中为一个三指针分配内存,我将能够把它作为一个二维数组使用,保存数据,然后在另一个函数中使用它。但是由于某些原因,一旦我离开函数,我就不能使用数据了。

另外,我必须使用在函数中写入的变量(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]);

c arrays pointers malloc heap
1个回答
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,

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 ***Cmat_mul(., ., float ***C) 函数原型是为了适应 传递地址 的二维矩阵(如 &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);
}
© www.soinside.com 2019 - 2024. All rights reserved.