[英]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.