【问题标题】:Confused on struct array and resizing in C对结构数组感到困惑并在 C 中调整大小
【发布时间】:2023-04-01 12:39:01
【问题描述】:

我对几个问题感到非常困惑。

  1. 创建包含两个可修改变量的多个结构
  2. 如果需要,增加结构的数量
  3. 使用按值传递将信息存储在两个可修改变量中。
  4. 可以在恒定时间内访问这些值吗?

所以假设我有这个..

 void * OPAQUE;

 typedef struct head Head;
 typedef struct data Data;
 struct  head
 {
   int size;
   int capacity;
   Data *info;
 };
 struct data
 {
   int key;
   int values;
 }

使用此函数传递值...

 void insert_data(OPAQUE *hOpaque, int key, int data);
 //cast to the known type..

如何在每次迭代中创建多个数据结构。每个结构都有一个新的值输入,所以......;

键 = 52; 数据 = 43;

这些值将在第一个对象中。现在..如果我提供 20 个密钥和 20 个数据怎么办。然后我会调整大小以适应更多值的涌入以创建更多结构。我总共有 20 个结构。

对我应该如何处理以及如何完成有点困惑。

谢谢

【问题讨论】:

  • 你知道动态内存分配吗? IE。 mallocfree 函数?然后你就上路了。接下来你听说过realloc 函数吗?如果没有阅读更多关于它的信息。现在,当您了解这些功能后,就可以开始尝试了。
  • 我应该更具体一些,但我不想使用 realloc 并且我知道如何将 malloc 用于变量而不是结构。我确定这是同一个概念,但我无法掌握它
  • 如果你希望能够动态改变一个“数组”的大小,那么你别无选择,只能使用realloc(好吧,你可以调用malloc来分配更多的内存, memcpy 复制旧数据,然后 free 旧内存,只需调用 realloc 就容易多了)。为结构分配内存与为任何其他类型分配内存相同:Data *my_data = malloc(sizeof *my_data * NUMBER_OF_STRUCTURES_NEEDED);
  • 您可以通过创建一个足够大以指向更多结构的新结构来更改大小,我只需要通过创建一个临时空间来为更多结构分配一个新空间,然后复制数据然后释放。然后将其设置为等于温度。我可以用变量来做到这一点。除非这对于结构是不可能的
  • mallocfreemallocfree。他们不在乎您将内存用于什么,malloc 函数只是分配一定数量的字节。手动完成所有您想做的事情正是realloc 所做的在一次调用中。此外,realloc 也有可能实际上扩展或重用已分配的内存以跳过复制,从而节省宝贵的 CPU 周期。

标签: c


【解决方案1】:

你可以使用 malloc() 来分配你需要的结构:

Data *info;

可以用来 malloc() 一个 Data 类型的结构,所以如果你想分配 20 个 Data 结构:

// Inside the function that receives the pointer to Headm assume h
// be the poiner to the Head structure:
h -> info = malloc(sizeof(Data) * 20);

或者根据需要动态重新分配结构,如果我们要增加到21个结构,例如:

h -> info = realloc(h -> info, (sizeof(Data) * 21));

另一种选择可能是:

 struct  head
 {
   int size;
   int capacity;
   Data info;
 };

 struct data
 {
   int key;
   int values;
 }

 Head **h = malloc(sizeof(Head *) * 20);

要分配一个数组 20 头结构指针,因此您不必 malloc() 数据结构。然后,您可以使用每个 Head 指针来分配单独的 Head 结构:

 int s;
 for (s = 0; s < 20; s++) {
     if ((h[s] = malloc(sizeof(Head))) == NULL) {
         perror("malloc()");
         exit(EXIT_FAILURE);
     }
 }

我想你有很多方法可以做到,这取决于你的需要。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    举个例子,你可以像这样手动完成

    Data *new_data = malloc(old_size + 1 * sizeof *new_data);
    if (new_data == NULL)
    {
        // Handle error
    }
    memcpy(new_data, old_data, old_size * sizeof *old_data);
    free(old_data);
    old_data = new_data;
    ++old_size;
    

    或者你可以这样做

    Data *new_data = realloc(old_data, old_size++ * sizeof *new_data);
    if (new_data == NULL)
    {
        // Handle error
    }
    old_data = new_data;
    

    不计算错误检查和处理,语句数量减少了60%。

    您决定哪个更简单。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多