【问题标题】:Adding elements to Struct Array向结构数组添加元素
【发布时间】:2015-09-02 01:52:37
【问题描述】:
struct GENERATIONS
{
char generation[MAX_ROWS][MAX_COLS];
int hasCycle;
};

typedef struct GENERATIONS Generation;

我有一个 struct 类型的数组:

Generation generations[MAX_GENERATIONS];

我像这样声明一个Generation变量:

Generation *currentGeneration = NULL;
currentGeneration = (Generation *) malloc(sizeof(Generation));

并尝试将世代添加到世代数组中:numGenerations 设置为 0,然后通过循环递增。

copyGeneration(currentGeneration);
generations[numGenerations] = currentGeneration;

然而,每次从“struct Generation *”类型分配给“Generation”类型时,我都会收到错误不兼容的类型。我知道这与我不理解但需要的指针有关。

为什么当我将数组声明为:

Generation *generations[MAX_GENERATIONS];

一切都突然起作用了?

【问题讨论】:

    标签: c arrays multidimensional-array struct


    【解决方案1】:

    每个currentGeneration 都是一个指向Generation 的指针。然而,当您声明一个数组Generation generations[MAX_GENERATIONS] 时,它希望每个索引成为Generation,而不是指向一个的指针。但是,当您将数组声明为 Generation *generations[MAX_GENERATIONS] 时,它希望每个索引都是指向 Generation 的指针,这是您分配给每个索引的内容。

    【讨论】:

    • 这是有道理的,当我测试从世代数组中获取元素时,我会创建一个新世代(如上所示)并执行g = generations[0]。然后我可以使用 g 访问所有“对象”数据,而无需使用 & 取消引用它,这是为什么呢?
    • 您是否使用-> 访问过?这就是您访问结构指针上的数据的方式。例如g->hasCycle.
    • 是的,我就是这样做的
    【解决方案2】:

    该错误准确地告诉您出了什么问题。您的变量currentGeneration 的类型为“指向生成的指针”,而您的变量generations 的类型为“生成的数组”。您不能将指向 Generation 的指针分配给 Generation 数组的索引——您只能分配 Generation。

    当您将数组声明为 Generation *generations[MAX_GENERATIONS] 时,一切正常,因为您将指向 Generation 的指针分配给指向 Generation 的指针数组的索引。

    【讨论】:

      【解决方案3】:

      要解决此问题,您可以采用不同的方式。你能做的就是这个

      #define MAX_GENERATIONS 1024 // you can take some other value too
      #include <stdio.h>
      #include <stdlib.h>
      static int count = 0
      
      Generation** push(Generation** generations, Generation obj){
       count++;
       if (count == MAX_GENERATIONS){
         printf("Maximum limit reached\n");
         return generations;
      
       if ( count == 1 )
         generations = (Generation**)malloc(sizeof(Generation*) * count);
       else
         generations = (Generation**)realloc(generations, sizeof(Generation*) * count);
      
       generations[count - 1] = (Generation*)malloc(sizeof(Generation));
       generations[count - 1] = obj;
      
       return generations;
      }
      
      int main(){
        Generation** generations = NULL;
        Generation currentGeneration;
        // Scan the the elements into currentGeneration
        generations = push(generations, currentGeneration); // You can use it in a loop
      }
      

      【讨论】:

      • 和这个看起来一样好,它似乎有点先进,我的教授可能知道它来自我以外的来源。我会说谢谢你,我以后会试试这个!
      • 好吧,没有问题..但目标是你理解这里的逻辑..如果可能的话,通过投票来帮助我提高我的声誉..
      【解决方案4】:

      currentGeneration 是 Generation *,而不是 Generation。

      您需要一个 Generation * 数组来保存它,而不是一个 Generation 数组。

      【讨论】:

        猜你喜欢
        • 2019-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-31
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 2012-03-23
        相关资源
        最近更新 更多