问题 1:奇怪的变量名。什么是l
和c
应该是什么意思?“线”,“计数”?C 中没有任何东西可以阻止您使用完整的单词作为变量名......
问题 2:您很可能使用带有指针对指针表示法的虚假的可能 2D 数组,这会导致堆碎片惨败。它不仅速度慢并导致堆碎片,而且不能与 memset()、memcpy() 等基本 C 函数一起使用。而是在相邻内存中分配一个真正的二维数组。
问题3:为什么* mat
在struct typedef的末尾有?这没有任何意义。
这是使用通用 C 编程的动态矩阵的基本实现:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
typedef struct mat_t
{
void** data;
size_t row_n;
size_t col_n;
size_t obj_size;
} matrix_t;
bool matrix_init (matrix_t* mat,
size_t row_n,
size_t col_n,
size_t obj_size)
{
mat->row_n = row_n;
mat->col_n = col_n;
mat->obj_size = obj_size;
mat->data = calloc(row_n * col_n, obj_size);
return mat->data != NULL;
}
void matrix_free (matrix_t* mat)
{
free(mat);
}
void matrix_set (matrix_t* mat,
size_t x,
size_t y,
void* val)
{
size_t data_offset = y * mat->row_n * mat->obj_size +
x * mat->obj_size;
memcpy (mat->data + data_offset,
val,
mat->obj_size);
}
void* matrix_get (const matrix_t* mat,
size_t x,
size_t y)
{
size_t data_offset = y * mat->row_n * mat->obj_size +
x * mat->obj_size;
return mat->data + data_offset;
}
int main()
{
matrix_t mat;
const int ROWS=3;
const int COLS=2;
// allocate memory
matrix_init(&mat, ROWS, COLS, sizeof(int));
// fill memory with data 1,2,3...
int count =0;
for(int row=0; row<ROWS; row++)
{
for(int col=0; col<COLS; col++)
{
count++;
matrix_set (&mat, row, col, &count);
}
}
// print the matrix
for(int row=0; row<ROWS; row++)
{
printf("[ ");
for(int col=0; col<COLS; col++)
{
printf("%d ", *(int*)matrix_get(&mat, row, col));
}
printf("]\n");
}
matrix_free(&mat);
return 0;
}