【问题标题】:C 2 dimensional array dynamic allocationC 二维数组动态分配
【发布时间】:2021-02-03 06:12:25
【问题描述】:
struct Cases
    {
        int number;
        char *name[][20];
    };

我有这个结构,它的二维数组的大小是未知的。我尝试为其分配大小,但出现错误。

int main()
    {
        struct Cases Real;
    
        Real.name = malloc(3 * sizeof(char));
        if (Real.name == NULL) {
            fprintf(stderr, "Malloc failed.\n");
            exit(1);
        }
.
.
.

【问题讨论】:

  • char *name[][20] - 这是一个字符数组的数组。它是一个字符串数组。这是一个段落数组。这个name 应该代表什么?有人有一组名称数组?你想建模什么?
  • name 是一个灵活的数组成员(因为它的外部大小是未指定的),而不是一个指针,所以你不能分配给它。而且它不是char *,所以3 * sizeof(char) 不会给出有用的大小。
  • 您似乎混合了flexible array member 和一般指针。请下定决心。
  • @KamilCuk 我将从用户那里获取城市名称并将其存储在数组中,但大小会不断变化,因此我无法从一开始就定义它。我必须每次都分配它。
  • @user253751: char *name[][20] 声明了一个包含 20 个指向 char 的指针的数组。要声明一个指向char 数组数组的指针,它必须是char (*name)[][20]。

标签: c multidimensional-array struct declaration dynamic-memory-allocation


【解决方案1】:

此声明

char *name[][20];

声明一个大小未知的数组。

就是这个结构声明

struct Cases
{
    int number;
    char *name[][20];
};

声明一个具有灵活数组成员的结构。

但是你不能像这个语句那样用指针分配数组

Real.name = malloc(3 * sizeof(char));

此外,malloc 的调用没有任何意义。

但您的意思似乎是声明指针而不是数组。那就是结构应该是这样的

struct Cases
{
    int number;
    char ( *name )[20];
};

如果你想分配一个包含 3 个“行”的数组,那么你应该写

Real.name = malloc(3 * sizeof(char[20]));

如果你想声明一个指向字符串字面量的指针数组,那么结构的声明可以是这样的

struct Cases
{
    int number;
    char **name;
};

在这种情况下,您可以通过以下方式分配内存

Real.name = malloc( 3 * sizeof( char * ) );

然后你可以分配分配数组的一个元素,例如像

Real.name[0] = "test";

【讨论】:

  • 可以说名称的元素是 {'test', 'test', 'test'} ,这里它有 3 个成员。每次输入新名称时,大小应增加一。所以这就是我稍后使用指针分配内存的原因。
  • 好的,我明白了,非常感谢,再问一个问题,如果尝试获得这样的名称scanf("%s", &Real.name[0]); 会起作用吗?
  • @Carl 它可以用于数据成员的第一个声明而不是第二个。
  • 是的,我刚试过,但程序崩溃了,我应该如何获取数据?
  • @Carl 这是一个运行良好的演示程序。 #include #include struct Cases { int number;字符(*名称)[20]; }; int main(void) { struct Cases Real = { 3, NULL }; Real.name = malloc(Real.number * sizeof(char[20])); scanf("%19s", Real.name[0]); puts(Real.name[0]);返回0; }
猜你喜欢
  • 2015-02-10
  • 2015-09-17
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-10
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多