【问题标题】:Allocate memory for an array of strings that is in a struct为结构中的字符串数组分配内存
【发布时间】:2022-11-28 23:27:10
【问题描述】:

所以我试图为结构中的字符串数组分配内存: 这是结构:

typedef struct{
    int aisleNumber;
    char **aisleProducts;
}Aisle;

这就是我分配内存的方式:

Aisle.aisleProducts = (aisleProducts*)malloc( sizeof(aisleProducts) );

现在,我只需要数组中一个字符串的空间,因此我不乘以大小。仍然不起作用,我不知道为什么......

任何帮助,将不胜感激。

【问题讨论】:

  • char **aisleProducts; 是一个指针指针,但您正试图为其分配一个指针 (aisleProducts*)malloc( sizeof(aisleProducts) )。类型不匹配。您还需要创建 Aisle 结构的实例... Aisle aisle; 然后使用它。
  • @Nox5692 您尝试分配的字符数组的大小是多少?
  • 不确定为什么人们投票关闭不清楚。很清楚为什么 malloc 调用不起作用。如果你想把它当作无聊的打字错误来关闭,我也许可以买那个,但不要因为不清楚而关闭。

标签: arrays c dynamic-memory-allocation


【解决方案1】:

malloc 电话毫无意义。对于指针数组,您应该分配 n * sizeof(char*),并且由于 malloc 返回指向第一个分配元素(这是一个指针)的指针,因此您不应将结果强制转换为 char*,而是将其视为 char**

例子:

#include <stdlib.h>
Aisle.aisleProducts = malloc( n * sizeof(*Aisle.aisleProducts) );

或同等学历:

#include <stdlib.h>
Aisle.aisleProducts = malloc( n * sizeof(char*) );

或同等学历:

#include <stdlib.h>
Aisle.aisleProducts = malloc( sizeof(char* [n]) );

【讨论】:

    【解决方案2】:

    它不起作用,因为 sizeof(...) 返回编译时常量值。 您的结构恰好是 12 个字节(至少在针对 64 位平台时是这样)。 int 值是 4 个字节,而指针(像所有其他指针一样)是 8 个字节。如果你想为你的字符串分配更多的内存,那么你将不得不手动分配和分配你的指针,也许是在一个循环中。 假设您有 4 个字符串:

    // Allocate space for the starting pointers
    Aisle.aisleProducts = (char**) malloc(sizeof(char*) * 4);
    // Then more space for each individual string (for convenience, let's give each one of them 64 bytes)
    for (int i = 0; i < 4; i++)
    {
        Aisle.aisleProducts[i] = (char*) malloc(sizeof(char) * 64);
    }
    // Assign your strings...
    

    【讨论】:

    • 您的评论“您的结构恰好是 12 个字节”是不正确的,因为这不是压缩结构。此结构中的每个元素都在字边界上对齐(占用 64 位)
    • @Ron 结构的大小及其成员的对齐方式与问题无关。也没有人说这是针对 64 位 PC 的。
    【解决方案3】:

    你可以试试

    Aisle* pAisle = (Aisle*)malloc(sizeof(Aisle));
    pAisle->aisleProducts = (char**)malloc(sizeof(char*));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2021-08-31
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多