我想创建一个带有动态变量声明的结构。
E.g。我有一个叫做点的结构。我想创建a1,a2,a3,a4,...这些都是类型点。
创建此声明通常是
struct point p1;
struct point p2;
变量n
应该是数字,应该是
struct point (p + valueOf(n))
有什么方法可以解决这个问题吗?
问题是在调用时创建一个结构,其中包含名称中包含的变量编号。
n
由另一个函数引发,而不是常量。
答案 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]
然后您可以访问从0
到N - 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 */
}
数组的元素索引从0
到size-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()
调用而不释放内存,程序就会崩溃,因为没有更多内存可供分配。