C |以计数器命名的struct

时间:2015-01-26 15:19:43

标签: c struct

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

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

创建此声明通常是

struct point p1;
struct point p2; 

变量n应该是数字,应该是

struct point (p + valueOf(n))

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


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

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

4 个答案:

答案 0 :(得分:2)

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

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

释放它

答案 1 :(得分:2)

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

struct point p[N];

然后 p n

p[n - 1]

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

这称为数组

答案 2 :(得分:2)

听起来你正在寻找一个阵列:

struct point a[n];

然后以a[0]a[1],...... a[n-1]的形式访问元素。

如果n过大,您可能需要动态分配malloc不足之处在于您必须记住使用free取消分配。

答案 3 :(得分:2)

编辑:由于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()调用而不释放内存,程序就会崩溃,因为没有更多内存可供分配。