无法将元素分配给 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
不超过该值)。它似乎与实际矩阵没有任何关系,不应存储。
希望大家一切都好。
我试图通过创建一个 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
不超过该值)。它似乎与实际矩阵没有任何关系,不应存储。