【问题标题】:dynamic allocation of array of pointers to structs结构指针数组的动态分配
【发布时间】:2014-01-09 23:58:46
【问题描述】:

我的程序中有 2 个结构。

id 的链接列表和一个 WORD

typedef struct related
{
    int id;
    struct related* next;
} RELATED;

typedef struct word
{
    int id;
    char name[NAME_LEN];
    RELATED *related;
} WORD;

我想保存一个 WORD 数组,并且我希望它是动态的。

我有 2 个指向单词的指针:

WORD* word1;
WORD* word2;

有价值观。

当我尝试以这种方式动态分配它时:

WORD** arr = (WORD**)malloc(sizeof(WORD*)*10)  // to hold 10 words

并尝试将一个单词添加到数组中,第一个添加正确,但第二个超出了第一个:

arr[0] = word1;
arr[1] = word2;

当我以这种方式定义数组时:

WORD* arr[40];

同样的词添加效果很好

arr[0] = word1;
arr[1] = word2;

找不到这种动态分配的正确方法.. 求帮助!

【问题讨论】:

  • Seems to work fine for me?(是的,不是释放内存,不过可以用于此目的)
  • 应该可以了,可以分享一下你的程序代码吗?

标签: c arrays dynamic struct malloc


【解决方案1】:

而不是

// arr as pointer to pointer to WORDS
WORDS** arr = (WORDS**)malloc(sizeof(WORDS*)*10);

分配

// arr as pointer to WORDS
WORDS* arr = malloc(sizeof(*arr) * 10);  // WORDS *, not WORDS **
  1. C gibberish ↔ English 可能有用。
  2. 不鼓励在 C 中转换 malloc() 的结果。
  3. 考虑type *p = malloc(sizeof(*p) * N); 样式。 IMO 更易于维护且不易出错。

【讨论】:

  • 不清楚的是“保留10个字”的评论。您的malloc() 拥有 10 个指向 WORDS 的指针。此外,您是否只想复制指针word1, word2 或它们指向的日期?
  • @Andrey Chasovski 您如何确定“但第二个超过第一个”?有了您编辑的信息,它似乎您正在做正确的事情 - 需要更多信息。
【解决方案2】:

我找不到 malloc() 和使用指向 WORD 指针的指针作为数组的任何问题。我可以指出的一件事是,您没有为 word1 和 word2 分配内存,它们拥有垃圾地址。将相同的垃圾地址分配给 arr[0] 和 arr[1]。如果您上传完整的代码,将有助于找出确切的问题。

【讨论】:

    【解决方案3】:

    您可以使用以下代码 sn-p 为二维数组动态分配内存:

    让 'm' 和 'n' 是数组的维度。

    WORDS** arr = (WORDS**)malloc(sizeof(WORDS*)*m);
    
    for(int i = 0 ; i < m ; i++)
    
    {
    
        for(int j = 0 ; j < n ; j++)
    
        {
    
             arr[i] = (WORDS*)malloc(sizeof(WORDS)*n);
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2022-01-14
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多