丙 |以计数器命名的结构
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]
然后您可以访问从 0
到 N - 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 */
}
数组的元素索引从 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()
进行足够多的调用后,您的程序将崩溃,因为不再有内存可供分配。
我想创建一个带有动态变量声明的结构。
例如我有一个叫做点的结构。我想创建 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]
然后您可以访问从 0
到 N - 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 */
}
数组的元素索引从 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()
进行足够多的调用后,您的程序将崩溃,因为不再有内存可供分配。