声明包含C中另一个变量内容的变量名

时间:2013-11-20 16:44:33

标签: c variables dynamic names

我正在开发一个项目,要求我命名一个具有预定前缀的结构数组变量,然后是一个数字。该程序以一个如下所示的数组开始:

foo[elements]

我需要声明这样的内容:

foo1[elements+1]

我不能只声明foo1[elements+1],因为没有预定数量的新数组具有更大的内容,因为我将迭代循环。如果我需要提供更多信息,或者我没有明确提出我的问题,请告诉我。我不知道这是否可能,但如果是的话,它肯定会缩短我的意思。

3 个答案:

答案 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类型,您可以执行以下操作:

  1. 如果elements是单个值,则可能是整数。一个很好的选择是动态分配的数组,请参阅Sergey's answer以获取代码段。

  2. 如果elements是一个更复杂的结构,只有几个字段。您可以使用包含N列表引用的列表或数组。类似的东西:

  3.  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);