无法将元素分配给 C 中动态分配的二维数组

Cannot Assign Elements to Dynamically Allocated Two Dimensional Array in C

希望大家一切都好。

我试图通过创建一个 Matrix 结构,然后使用它的内存地址来执行操作,用 C 编写一个简单的 Matrix 库。

这是我的库头文件:

/*
To compile:

g++ -c simpMat.cpp
ar rvs simpMat.a simpMat.o
g++ test_simpMat.c simpMat.a
*/

#ifndef SIMPMATH_H
#define SIMPMAT_H

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct{
    uint8_t nRows;
    uint8_t nCols;
    uint8_t nElements;
    float **elements;
}simpMat;

/**
*@brief simpMat_Init
*@param simpMat
*@param uint8_t
*@param uint8_t
*@param uint8_t
*@param float* 
*@retval NONE
*/
void simpMat_Init(simpMat *Matrix, uint8_t nRows, uint8_t nColumns, uint8_t nElements, float elements[]);

/**
*@brief simpMat_Print
*@param simpMat
*@retval NONE
*/
void simpMat_Print(simpMat *Matrix);

/**
*@brief simpMat_Delete
*@param simpMat
*@retval NONE
*/
void simpMat_Delete(simpMat *Matrix);

#endif

这是源文件:

#include "simpMat.h"

void simpMat_Init(simpMat *Matrix, uint8_t nRows, uint8_t nColumns, uint8_t nElements, float elements[])
{
    Matrix->nRows = nRows;
    Matrix->nCols = nColumns;
    Matrix->nElements = nElements;

    Matrix->elements = (float**)malloc(nRows * sizeof(float*));
    for (uint8_t i = 0; i < nRows; i++)
    {
        Matrix->elements[i] = (float*)malloc(nColumns * sizeof(float));
    }
    
    uint8_t count = 0;

    for (uint8_t i = 0; i < nRows; i++)
    {
        for (uint8_t j = 0; j < nColumns; j++)
        {
            Matrix->elements[i][j] = elements[count];
            count++;
        }
    }      
        
}

void simpMat_Print(simpMat *Matrix)
{
    for (uint8_t i = 0; i < Matrix->nRows; i++)
    {
        for (uint8_t j = 0; j < Matrix->nCols; j++)
        {
            printf("%d ", Matrix->elements[i][j]);

        }

        printf("\n");
    }
}


void simpMat_Delete(simpMat *Matrix)
{
    uint8_t n = Matrix->nRows;
    while(n) free(Matrix->elements[--n]);
    free(Matrix->elements);
}

我还写了一个小测试程序,看看我是否可以成功地将元素分配给矩阵;如:

#include "simpMat.h"
#include "stdio.h"

int main()
{
    simpMat Matrix1;

    float toAppend[9] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};

    simpMat_Init(&Matrix1, 3, 2, 9, toAppend);

    printf("MATRIX ELEMENTS ARE:\n");

    simpMat_Print(&Matrix1);

    simpMat_Delete(&Matrix1);

    return 0;

}

我在 CMD 上使用以下命令编译了我的库和主程序:

g++ -c simpMat.cpp
ar rvs simpMat.a simpMat.o
g++ test_simpMat.c simpMat.a

但是,当我 运行 可执行文件时,我得到以下输出:

MATRIX ELEMENTS ARE:
0 0
0 0
0 0

我无法理解无法赋值的原因。我对动态内存分配主题相当陌生,我怀疑我对该方法有误解。你能帮我吗?

如果您使用调试器逐步查看内存中的程序,您应该会看到 实际存在的数据。你的问题假设问题是分配,而它实际上在你的输出中。这种事情最容易用调试器发现。

实际问题是您的矩阵元素是 float。但是您在 printf 中使用 %d 说明符,它用于 int 值。将其更改为 %f.

另外,您应该重新考虑 nElements 参数的用途。在复制数组之前没有进行任何完整性测试(例如,确保 rows * cols 不超过该值)。它似乎与实际矩阵没有任何关系,不应存储。