[英]Dynamically allocating a vector C
我正在嘗試了解在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]
,還有另一種方法可以做同樣的事情嗎? 我聽說過通用動態分配內存,有人可以給我一個答案。 其中?
當您執行i++
您會松開原始指針。 相反,您可以使用常規數組索引:
i[0].id = 22;
i[1].id = 33;
以后要釋放分配的內存時,需要原始指針。
以下所有都是同義詞:
*(i + 9)
*(9 + i)
i[9]
9[i]
您引用動態分配數組中的元素的方式與引用自動數組中元素的方式相同。
使用pers[i]
將引用第ith個元素。 要訪問諸如id
的字段,您可以使用pers[i].id
。
通常,您可以在typedef struct
之前(外部)執行typedef struct
,但是它可以工作。
您的分配是正確的。
但是i++
在這里沒有任何意義。 您應該保留指針i
以便您仍然知道分配的內存從哪里開始。 您可能想要的是另一個指向數組的指針,並將其增加:
pers* it = i;
it->id=22;
printf("%d", it->id);
it++;
it->id=33;
printf("%d", it->id);
您不應該更改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
; 這使得代碼更具可讀性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.