从巨大的二维结构数组中创建结构的子数组

Posted

技术标签:

【中文标题】从巨大的二维结构数组中创建结构的子数组【英文标题】:Creating sub-arrays of structs from within huge 2-dimensional struct array 【发布时间】:2020-03-20 19:27:03 【问题描述】:

我有一个结构定义为

struct KVPair 
    char key[7];
    double value;
;

我使用创建一个二维空结构数组

KVPair 矩阵[1000][500]=;

我稍后会填充这些值。

但是,我想要的是我应该能够从巨大的二维 1000x500 数组中创建子数组(二维)

意思是,如果在我的程序中的某个时候需要,我应该能够创建(或子分配或任何想使用的术语)类似

KVPair subMatrix[20][15]; 

这不应该使用新的内存块,而应该使用巨大数组中的现有块。有点租用内存空间。

然后又在某处下线

KVPair anotherSubMatrix[70][30];

当工作完成后,它也应该腾出租用的内存空间,以便下一个租户可以使用它。

在进行了一些 google 和 *** 搜索之后,使用一维数组执行此操作看起来有些直接,但二维数组看起来具有挑战性。

欢迎任何代码建议。

注意:我需要做这一切,因为在我的组织中不允许在堆上分配内存,而且我们严格遵循提到的错误准则 “数组声明应包含明确的大小规范”

【问题讨论】:

【参考方案1】:

说,你被要求得到一个子矩阵'm',从第3行,第4列开始,维度为m[10][5];

KVPair matrix[1000][500] =  ... some values ...;

// first row index is '0', so row = 3 means 4th row
// and first column index is '0', so column = 4 means 5th column

int nRow = 10;
int nCol = 5;
int headRow = 3;
int headCol = 4;

KVPair *head = &matrix[headRow][headCol];
KVPair **m = malloc(nRow * nCol * sizeof(KVPair *));

for (int row = 0; row < nRow; row++) 
  for (int col = 0; col < nCol; col++) 
    *(m + nCol * row + col) = head + col;
    // printf("%s\n", (*m + nCol * row + col)->key);
    // getchar();
  

  head += 500 - nCol;


free(m);

n.b.新矩阵 'm' 将不包含原始矩阵的 ,而是包含指向相应结构元素的 指针。因此,如果你想取消引用并读取矩阵结构的值,你会喜欢;

char *cTmp = (*m + nCol * row + col)->key;
double dTmp = (*m + nCol * row + col)->value;

附言将结构定义为 typedef 会让事情变得更容易:

typedef struct 
    char key[7];
    double value;
 KVPair;

【讨论】:

以上是关于从巨大的二维结构数组中创建结构的子数组的主要内容,如果未能解决你的问题,请参考以下文章

在python中创建没有作为参数传递的aubarrays的子数组

在子数组列表中创建并查找最大值

我必须在 C 中创建一个带有指向数组的结构数组

如何从字符串数组在 json 字符串中创建层次结构?

获取指定索引之间的数组的子数组

求二维数组最大子数组