【问题标题】:How to allocate contiguous 2D array of strings in C如何在C中分配连续的二维字符串数组
【发布时间】:2016-11-12 21:52:49
【问题描述】:

我是整个 C 编程领域的新手(来自 Java),老实说,这真的令人困惑。好的,我正在尝试为我的 2D 字符串数组分配连续的数据块(猜测它类似于 3D 数组??)。我所拥有的就是我相信字符串数组的连续分配? 有人可以帮我解决二维数组吗?

是的,我在运行程序之前就知道大小,它定义为 ROWS 用于行,COLS 用于列,NAME 用于字符串长度。

char **people = malloc(COLS * sizeof(char *));

people[0] = malloc(COLS * NAME);
for(int i = 1; i < COLS; i++)
    people[i] = people[0] + i * NAME;

【问题讨论】:

  • 您的代码从不使用 ROWS。这是故意的吗?
  • 我忘了说这段代码应该为字符串数组分配连续的数据。对于 1D 数组而不是 2D,我无法弄清楚我需要帮助的 2D 事物,这就是我从未使用过 ROWS 的原因。
  • char (*people)[COLS][NAME] = malloc(ROWS * sizeof *people); 应该可以完成这项工作。

标签: c arrays string malloc 2d


【解决方案1】:

如果您在运行程序之前确实知道数组的大小,则无需使用 malloc 动态分配内存,您可以创建一个 2D 静态数组。在您的情况下,由于它是一个二维字符串数组,因此可以将其声明为 char * array[ROWS][COLS],然后您可以通过这种方式将字符串分配给特定元素:array[nrow][ncol]="Your String"

【讨论】:

  • 这实际上并不连续。听起来 OP 想要char array[ROWS][COLS][NAME],然后是strcpy(array[nrow][ncol], "Your String")
  • Sizigia 抱歉,我需要连续内存。 Ruakh omg 伙计,谢谢我以某种方式怀念这种方法,我如此沉迷于动态分配字符串,以至于我想念 strcpy ......好在我从现在开始对指针和数组有了更好的理解:D 谢谢
  • (哦,但是:+1 建议使用静态内存。通常我们会想到堆与堆栈,当然堆栈有时比堆具有更多限制性的大小限制;但是在许多情况下,静态分配是一个不错的选择。)
  • @Pauli 没问题,我认为您只是想为数组本身分配连续内存,而不是专门为字符串元素分配内存,因为您试图在代码上使用指针。
【解决方案2】:

C与Java不同,实际上有一个多维数组的概念;因此,除非有特定原因需要char * * *,否则您可能更愿意写:

char (*people)[COLS][NAME] = malloc(ROWS * sizeof(*people));

people 设置为指向ROWS 动态分配的二维字符数组中的第一个的指针。

由于指针“衰减”,其中数组类型的表达式将兼作指向数组第一个元素的指针,您可以像使用char * * * 一样使用people;例如,people[3][4] 将指向第 3 行第 4 列中的字符串。唯一的限制是您不能写类似people[3][4] = ... 的内容来突然更改要指向的字符串。但听起来你无论如何都不想这样做?


注意:以上假设您有意使用动态内存分配。但是,我确实建议您考虑 Sizigia 的使用静态内存的建议,它与用于全局变量的存储类型相同。如果你写类似

static char people[ROWS][COLS][NAME];

那么内存将在程序开始时只分配一次,并被声明它的函数的所有调用重用。

【讨论】:

    【解决方案3】:

    您可以使用typedef 定义char *,以便您更好地理解代码。那么你所要做的就是动态分配一个你定义类型的二维数组(在下面的例子中,我将它定义为一个“字符串”):

     typedef char * string;
     string ** people;
     people = malloc(ROWS * sizeof(string));
     for(int i = 0; i < ROWS; i++){
        people[i] = malloc(COLUMNS * sizeof(char));
     }
    

    您可以使用普通数组 sintax people[i][j] 访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2021-12-07
      • 2020-01-18
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多