繁体   English   中英

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

[英]Cannot Assign Elements to Dynamically Allocated Two Dimensional Array in C

希望每个人都做得很好。

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

这是我的图书馆 header 文件:

/*
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

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

MATRIX ELEMENTS ARE:
0 0
0 0
0 0

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

如果您使用调试器并单步执行查看 memory 的程序,您应该会看到数据确实存在。 你的问题假设问题是赋值,而它实际上在你的 output 中。这种事情最容易用调试器发现。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM