如何在 C 中分配连续的二维字符串数组

问题描述 投票:0回答:4

我对整个 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;
c arrays string malloc 2d
4个回答
1
投票

如果您在运行程序之前实际上知道数组的大小,则不需要使用 malloc 动态分配内存,您可以创建一个 2D 静态数组。在您的情况下,由于它是一个 2D 字符串数组,因此可以将其声明为

char * array[ROWS][COLS]
,然后您可以通过以下方式将字符串分配给特定元素:
array[nrow][ncol]="Your String"


1
投票

C 与 Java 不同,实际上有多维数组的概念;因此,除非有特定原因您想要

char * * *
,否则您可能更喜欢写:

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

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

由于指针“衰减”,数组类型的表达式将兼作指向数组第一个元素的指针,因此您可以像使用

people
一样使用
char * * *
;例如,
people[3][4]
将指向第 3 行第 4 列中的字符串。唯一的限制是您不能 编写类似
people[3][4] = ...
的内容来突然更改要指向的字符串。但听起来你无论如何都不想这样做?


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

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

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


1
投票

您可以使用

char *
定义
typedef
,这样您可以更好地理解代码。然后您所要做的就是动态分配您定义类型的二维数组(在下面的示例中,我将其定义为“字符串”):

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

您可以使用普通数组语法来访问它,

people[i][j]


-1
投票

35633333333333333333333333333333356333333333333333333333333333333563333 333333333333333333333333335633333333333333333333333333333356333333333333 333333333333333333563333333333333333333333333333335633333333333333333333 3333333333563333333333333333333333333333335633333333333333333333333333333 356333333333333333333333333333333563333333333333333333333333333335633333 333333333333333333333333356333333333333333333333333333333563333333333333 333333333333333335633333333333333333333333333333356333333333333333333333 333333333563333333333333333333333333333335633333333333333333333333333333

© www.soinside.com 2019 - 2024. All rights reserved.