注册 登录
编程论坛 C语言论坛

二维数组变量赋值二维数组内存

古123 发布于 2020-06-24 09:59, 2723 次点击
程序代码:
int col;
    int row;
   
    float f[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };

    col = 4;
    row = 4;
   
    // 申请内存
    float** Rmatrix = (float**)malloc(sizeof(float*) * col);
    for (int i = 0; i < col; i++) {
        Rmatrix[i] = (float*)malloc(sizeof(float) * row);
    }
    // 赋值
    Rmatrix = f;

    for (int i = 0; i < col; i++) {
        for (int j = 0; j < row; j++) {            
            printf(" %f ", Rmatrix[i][j]);
        }
        putchar('\n');
    }

错误如下:
只有本站会员才能查看附件,请 登录

使用VS2019写的,
请问为什么呢?
8 回复
#2
fulltimelink2020-06-24 11:04
Rmatrix 是指向 已经申请内存 的指针, 所以不应该去修改指针的指向,应该去修改指针指向的“内容”
程序代码:

#include<stdio.h>
#include <stdlib.h>
int main()
{
    int col;
    int row;

    float f[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };

    col = 4;
    row = 4;

    // 申请内存
    float** Rmatrix = (float**)malloc(sizeof(float*) * col);
    for (int i = 0; i < col; i++) {
        Rmatrix[i] = (float*)malloc(sizeof(float) * row);
    }
   

    for (int i = 0; i < col; i++) {
        for (int j = 0; j < row; j++) {
            // 赋值
            Rmatrix[i][j] = f[i][j];
            printf(" %f ", Rmatrix[i][j]);
            
        }
        //释放
        free(Rmatrix[i]);
        putchar('\n');
    }
    //释放
    free(Rmatrix);
    return 0;
}

#3
纯蓝之刃2020-06-24 11:23
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int col, row;
    int i, j;

    float f[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };

    col = 4;
    row = 4;

    // 申请内存
    float** Rmatrix = (float**)malloc(sizeof(float*) * col);
    for (i = 0; i < col; i++)
        *(Rmatrix + i) = (float*)malloc(sizeof(float) * row);


    for (i = 0; i < col; i++)
        memcpy(*(Rmatrix + i), f[i], sizeof(float) * row);


    for (i = 0; i < col; i++)
    {
        for (j = 0; j < row; j++)
        {
            printf(" %g\t", *(*(Rmatrix + i) + j));
        }
        putchar('\n');
    }

    //释放
    for (i = 0; i < col; i++)
        free(*(Rmatrix + i));
    free(Rmatrix);

    return 0;
}
#4
古1232020-06-24 14:15
回复 2楼 fulltimelink;回复 3楼 纯蓝之刃
emm,请问能不能写在一个函数中呢?
就是把二维数组变量写在二维数组内存中。
试过void s(float **a,int col,int row){}
void s(float *a[],int col,int row){}
都不可以。不知道为什么

程序代码:
typedef struct
{
    float** value;
    int col;
    int row;
}Mat;
Mat s(float** m,int col,int row)
{
    Mat r;
    r.col = col;
    r.row = row;

    //// 申请内存
    float** Rmatrix = (float**)malloc(sizeof(float*) * col);
    for (int i = 0; i < col; i++) {
        Rmatrix[i] = (float*)malloc(sizeof(float) * row);
    }

    for (int i = 0; i < col; i++) {
        for (int j = 0; j < row; j++) {
            Rmatrix[i][j] = m[i][j];//这一步出错
        }
    }
    r.value = Rmatrix;
    return r;
}


[此贴子已经被作者于2020-6-24 14:28编辑过]

#5
纯蓝之刃2020-06-24 15:02
Rmatrix[i][j] = *((float*)m + i * row + j);//这一步出错
#6
Mchen20002020-06-24 15:14
小白改怎么学习
#7
吹水佬2020-06-24 15:28
#include <stdio.h>
#include <stdlib.h>

float* s(float** m, int row, int col)
{
    int n = row*col;
    float* f = (float*)malloc(n*sizeof(float));
    float* p = (float*)m;
    float* ret = f;
    int i;
    for (i=0; i<n; ++i)
       *f++ = *p++;
    return ret;
}

int main()
{
    int col, row;
    int i, j;

    float f[4][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16} };

    col = 4;
    row = 4;

    float* m = s((float**)f, row, col);
   
    for (i=0; i<row; ++i)
    {
        for (j=0; j<col; j++)
        {
            printf(" %g\t", *(m+col*i+j));
        }
        putchar('\n');
    }

    //释放
    free(m);

    return 0;
}
#8
lin51616782020-06-24 16:34
二维数组和二级指针完全是两回事
函数传入二维数组不能用二级指针做形参
实践中 常见实现是用一级指针传递二维数组
void s(float* arr, int col, int row);
float arr[4][4];
s(*arr, 4, 4);
#9
古1232020-06-24 18:43
感谢
1