丙 |以计数器命名的结构

C | struct named after a counter

我想创建一个带有动态变量声明的结构。

例如我有一个叫做点的结构。我想创建 a1, a2, a3, a4, ... 都是点类型。

创建这个的声明通常是

struct point p1;
struct point p2; 

有一个变量n应该是数字,按想法应该是

struct point (p + valueOf(n))

有什么办法可以解决这个问题吗?


问题是在调用时创建一个名称中包含变量编号的结构。

n 由另一个函数引发而不是常量。

struct point *p = malloc(sizeof(strutc point) * n);

使用malloc()动态分配内存,这样您就可以指定大小,如上所示。使用分配的内存后,您需要使用 free(p)

释放它

是有,假设N是常数,那么

struct point p[N];

然后 pn 将是

p[n - 1]

然后您可以访问从 0N - 1 的每个元素。

这就是所谓的和Array.

听起来您正在寻找一个数组:

struct point a[n];

然后访问元素 a[0], a[1], .... a[n-1].

如果n太大,你可能需要用malloc动态分配,缺点是你必须记得用free取消分配。

编辑:由于 C99 C 具有可变长度数组,因此您可能不需要动态内存分配。

您可以做的是:

int i;
for(i = 5; i <= 10; ++i)
{
    struct point p[i];
    /* Do something with p */
}

数组的元素索引从 0size-1 所以在这种情况下第一个元素是 p[0] 最后一个是 p[i-1].


如果n在编译时不是常量,你需要使用动态内存分配。正如 Gopi 回答的那样:

struct point *p = malloc(sizeof(struct point) * n);

会成功的。但是,当你动态分配内存时,你必须记得在你停止使用它之后释放它。

free(p);

如果您不这样做,那么您可能会泄漏内存,即您将拥有一些已分配的内存,但您将无法访问它。例如:

void foo(int i)
{
    struct point *p = malloc(sizeof(strutc point) * i);

    /* Do something with p */

    free(p);
}

每次调用foo()都会分配一个新的数组。如果函数末尾没有 free(p); ,您将泄漏内存,因为分配的数组将不可访问但仍会占用该内存。在不释放内存的情况下对 foo() 进行足够多的调用后,您的程序将崩溃,因为不再有内存可供分配。