0

我试图理解在 C 中动态分配“结构”的概念,我也对通用动态分配感兴趣,你能给我一些关于这个主题的帮助或信息吗?

我已经设法理解了指针的概念,并且我设法理解了某种代码,但我不确定它是否正确,或者它是否按应有的方式工作......

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    typedef struct {
        int id;
        char nume[20];
    } pers;

    pers *i = malloc(sizeof(pers)*100);

    i->id=22;
    i++;
    i->id=33;
}

我的问题是,我是否正确声明了该数组,如何打印该数组的元素,如何引用 eq 的特定元素。i[9],还有另一种方法可以做同样的事情吗?我听说过通用动态分配内存,有人可以给我一个 eq. 那个?

4

5 回答 5

4

当您这样做时,i++您会松开原始指针。相反,您可以使用普通的数组索引:

i[0].id = 22;
i[1].id = 33;

当您稍后想要释放分配的内存时,您需要原始指针。

于 2013-03-07T12:56:41.243 回答
2

以下都是同义词:

*(i + 9)

*(9 + i)

i[9]

9[i]

于 2013-03-07T12:55:34.647 回答
2

引用动态分配数组中的元素的方式与引用自动数组中的元素相同。

使用pers[i]将引用第 i 个元素。要访问id您将使用的字段pers[i].id

于 2013-03-07T12:57:15.470 回答
2

通常你会做typedef struct之前(外面)的功能,但它的工作原理。

你的分配是正确的。

i++在这里没有任何意义。您应该保留指针i,以便您仍然知道分配的内存从哪里开始。您可能想要的是另一个指向数组的指针,并增加它:

pers* it = i;
it->id=22;
printf("%d", it->id);
it++;
it->id=33;
printf("%d", it->id);
于 2013-03-07T13:00:35.873 回答
1

您不应该更改 malloc 返回给您的指针。将其视为常量以避免造成内存泄漏(分配和丢失指向已分配内存的指针)。与其修改i,不如使用一个新的索引变量进行迭代,我们称之为j:清除/初始化所有数组元素:

#include <string.h> /* for memset(). */
int j;
for (j=0; j<100; ++j) {
  i[j].id = 0;
  memset (i[j].nume, 0, 20); /* Or sizeof(i[0].nume) instead of 20. */
}

打印所有数组元素:

for (j=0; j<100; ++j) {
  printf ("id[%d] = %d\n", j, i[j].id);
  printf ("nume[%d] = '%s'\n", j, i[j].nume);
}

我还建议重命名iperson; 这使代码更具可读性。

于 2013-03-07T13:03:50.670 回答