我正在尝试理解在C中动态分配`struct'的概念,我也对通用动态分配感兴趣,你能给我一些关于这个主题的帮助或信息吗?
我已经设法理解了指针的概念,我设法使用某种代码,但我不确定它是否正确或是否正常工作......
#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。那个?
答案 0 :(得分:4)
执行i++
时,您会松开原始指针。相反,您可以使用普通的数组索引:
i[0].id = 22;
i[1].id = 33;
以后想要释放分配的内存时需要原始指针。
答案 1 :(得分:2)
以下所有都是同义词:
*(i + 9)
*(9 + i)
i[9]
9[i]
答案 2 :(得分:2)
您引用动态分配的数组中的元素的方式与引用自动数组中的元素的方式相同。
使用pers[i]
将引用第i个元素。要访问id
等字段,您可以使用pers[i].id
。
答案 3 :(得分:2)
通常你会在函数之前(外部)执行typedef struct
,但它可以正常工作。
您的分配是正确的。
但i++
在这里毫无意义。您应该保留指针i
,以便仍然知道分配的内存从何处开始。您可能想要的是另一个指向数组的指针,并增加:
pers* it = i;
it->id=22;
printf("%d", it->id);
it++;
it->id=33;
printf("%d", it->id);
答案 4 :(得分: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);
}
我还建议将i
重命名为person
;这使得代码更具可读性。