【问题标题】:How to realloc 2d struct pointer with different size如何重新分配不同大小的二维结构指针
【发布时间】:2019-09-04 20:03:50
【问题描述】:

我想重新分配二维指针数组。必须是动态的,如下ascii

+=====+==============+==============+==============+==============+======+
|     | [0]          | [1]          | [2]          | [3]          | [..] |
+=====+==============+==============+==============+==============+======+
| [0] | 'a'          | 'b'          | 'c'          | 'd'          |      |
+-----+--------------+--------------+--------------+--------------+------+
| [1] | object[0][0] | object[1][0] | object[2][0] | object[3][0] |      |
+-----+--------------+--------------+--------------+--------------+------+
| [2] | object[0][1] | object[1][1] | object[2][1] | object[3][1] |      |
+-----+--------------+--------------+--------------+--------------+------+
| [3] | object[0][2] | object[1][2] | object[2][2] |              |      |
+-----+--------------+--------------+--------------+--------------+------+
| [4] | object[0][3] |              | object[2][3] |              |      |
+-----+--------------+--------------+--------------+--------------+------+
| [5] | object[0][4] |              |              |              |      |
+-----+--------------+--------------+--------------+--------------+------+
| [6] | object[0][5] |              |              |              |      |
+-----+--------------+--------------+--------------+--------------+------+

在此表中,每个列的大小都不同。我怎么能用二维结构做到这一点。我用malloc分配了矩阵。但我想重新分配第二个索引。像这个矩阵[25][n]。对于具有不同大小的每一列,N 必须重新分配。但它必须在运行时

代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    char word[20];
}Dictionary;

Dictionary **object;
void initializeDictionary()
{
     // Create matrix [29][1]
     object=(Dictionary**)malloc(29 * sizeof(Dictionary*));
     object[0]=(Dictionary*)malloc(1*sizeof(Dictionary));
}

【问题讨论】:

  • 为什么行索引4和列索引1有间隙?这是否意味着那里的指针为空?
  • @JonathanLeffler:OP 正在考虑每列的数据,以便第一个索引选择一列。
  • @Jack:是的,我刚刚意识到 OP 没有使用普通的array[row][col] 表示法,而是使用了array[col][row],这肯定会让我感到困惑——至少,而且相当可能是他们,也可能是其他半专注于 SO 的读者。
  • 是的,和你说的一样@JonathanLeffler。

标签: c multidimensional-array struct malloc realloc


【解决方案1】:

有了指针,这很自然。在您的代码中,您有一个 Dictionary**,它确实是一个指向 Dictionary 的指针。但你可以看到它是一个 Dictionary* 数组,其中每个指针指向不同大小的 Dictionary 对象数组。

Dictionary** objects;
const int COLUMNS = 29;

objects = malloc(COLUMNS * sizeof(Dictionary*));

objects[0] = malloc(2 * sizeof(Dictionary)); // first column 2 elements
objects[1] = malloc(3 * sizeof(Dictionary)); // second column 3 elements

// ...

for (int i = 0; i < COLUMNS; ++i)
  free(objects[i]);

free(objects);

【讨论】:

  • 我编译了你的代码。当我尝试这段代码时: objects[0] = malloc(2 * sizeof(Dictionary)); ..// 我可以访问和分配 *(objects[0][100]).word 。最多不应该是2?为什么我可以访问 100?
  • 因为避免未定义的行为是你的责任,所以语言本身并不能阻止你做错事。您没有访问有效的内存。
  • 我需要在运行时增加大小而不删除数据
  • 那么要么你 malloc 另一个数组,memcpy 元素并替换指针,要么你使用 realloc 这已经为你做了。
  • 这正是我想要的。如何对 m 索引使用 realloc,例如 [k] [m]
猜你喜欢
  • 2020-05-06
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2018-06-05
相关资源
最近更新 更多