动态分配向量C

动态分配向量C,c,C,我试图理解C语言中动态分配“struct”的概念,我也对一般的动态分配感兴趣,你能给我一些关于这个主题的帮助或信息吗 我已经设法理解了指针的概念,我设法找到了某种代码,但我不确定它是否正确,或者它是否按应有的方式工作 #include <stdio.h> #include <stdlib.h> int main(void) { typedef struct { int id; char nume[20]; } pers;

我试图理解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;
}
#包括
#包括
内部主(空)
{
类型定义结构{
int-id;
查努姆[20];
}pers;
pers*i=malloc(尺寸(pers)*100);
i->id=22;
i++;
i->id=33;
}

我的问题是,我是否正确声明了此数组,如何打印此数组的元素,如何引用eq.
I[9]
的特定元素,是否有其他方法来执行相同的操作?我听说过通用动态分配内存,有人能给我一个等式吗?

以下都是同义词:

*(i+9)

*(9+i)

i[9]


9[i]
执行
i++
操作时,会松开原始指针。相反,您可以使用普通数组索引:

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

以后要释放分配的内存时,需要原始指针。

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


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

通常您将在函数之前(外部)执行
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);
}
#包含/*用于memset()*/
int j;

对于(j=0;开玩笑,如果我想在元素之间滑动,我可以这样做吗?(int j=0;jid=0})使所有元素的id为0?9[i]应该是什么?@QuentinUK:它是*(9+i)。非常糟糕的风格,但是合法。@JackRobinson当然可以,只是它是
i[j]。id
而不是
i[j]->id
,因为
i
是指针,而
i[j]
又是对象。i[9]=*(i+9)=*(9+i)=9[i]根据标准定义,通常在函数外部定义结构。在includes和main之间。您不应该真正更改i,因为您将丢失数组的开头。您将需要它来稍后释放内存。您需要在使用它之前检查
i
是否非空,以防
malloc
在某些情况下失败eason.为什么不使用memset(i,0,100*sizeof(pers))而不是手动初始化所有字段?因为这使得根据索引使用不同的值初始化不同的元素或成员变得更加困难。OP可能更关心如何处理单个对象,而不是只关心一种特殊情况,即所有零都是所需的。此外,如果结构包含指针(这里没有),初始化指向NULL的指针时,全零是不好的。typedefs从此就可以有块作用域了;这有点不寻常,但保证可以工作。@Jens我知道。是的,不寻常。