我正在开发一个项目,要求我命名一个具有预定前缀的结构数组变量,然后是一个数字。该程序以一个如下所示的数组开始:
foo[elements]
我需要声明这样的内容:
foo1[elements+1]
我不能只声明foo1[elements+1]
,因为没有预定数量的新数组具有更大的内容,因为我将迭代循环。如果我需要提供更多信息,或者我没有明确提出我的问题,请告诉我。我不知道这是否可能,但如果是的话,它肯定会缩短我的意思。
答案 0 :(得分:3)
在C中,变量名必须在编译时知道。无法在运行时创建新的变量名称。不是正确的语言。
最好的办法是分配一个可以容纳阵列的阵列:
int ** foo = calloc(sizeof(*foo), numarrays);
for (i = 0; i < numarrays; i++)
foo[i] = calloc(sizeof(**foo), elements + i);
答案 1 :(得分:0)
您遇到为未知数量的元素动态分配内存的问题。这里的关键是动态内存,因此您必须跟踪自己的内存块。您必须在某个时候使用malloc()
和free()
。
根据您的需要elements
类型,您可以执行以下操作:
如果elements
是单个值,则可能是整数。一个很好的选择是动态分配的数组,请参阅Sergey's answer以获取代码段。
如果elements
是一个更复杂的结构,只有几个字段。您可以使用包含N列表引用的列表或数组。类似的东西:
foo[0] -> fooN[0] -> ... -> fooN[N] . | | . element 0 element N . foo[M] -> fooN[0] -> ... -> fooN[N] | | element 0 element N
如果事先知道M,则可以使用数组。如果M或N都不知道,您将使用嵌套的linked lists。这是链接列表的链接列表。
你会在网上找到TONS of C链表实现。
答案 2 :(得分:0)
你不能静态地分配foo1,比如foo1 [elements + 1],除非元素的值不是你在运行时才知道的东西。 如果你知道你想要的元素数量而不是在声明中使用变量:
#define ELEMENTS 10
int foo [ELEMENTS]; int foo1 [ELEMENTS + 1];
或者,如果它是您在运行时没有的东西,请使用动态内存分配
int *foo, *foo1;
foo = (int*)malloc(sizeof(int)* elements);
foo1 = (int*)malloc(sizeof(int)*( elements+1 ) );
并且不要忘记释放你已完成的记忆:
free(foo);
free(foo1);