【问题标题】:Declaring a variable name that contains the contents of another variable in C在 C 中声明一个包含另一个变量内容的变量名
【发布时间】:2013-12-04 18:59:02
【问题描述】:

我正在做一个项目,该项目要求我使用预先确定的前缀和数字命名结构数组变量。该程序从一个如下所示的数组开始:

foo[elements]

我需要这样声明:

foo1[elements+1]

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

【问题讨论】:

  • 在 C 中,所有类型必须在编译时已知。改变你的设计...
  • 变量名也是如此
  • 可以动态创建变量,使用malloc,创建变长数组。此外,您可以使用预处理器粘合来更改变量的名称(在末尾附加一个数字),但正如 hyde 所说,这必须在编译时知道。
  • 想到的是使用#define 将元素分配给某物。能否解释一下这个需求的用例?

标签: c variables dynamic names


【解决方案1】:

C 变量名必须在编译时知道。无法在运行时创建新的变量名。语言不正确。

你最好的选择是分配一个数组来保存你的数组:

int ** foo = calloc(sizeof(*foo), numarrays);
for (i = 0; i < numarrays; i++)
    foo[i] = calloc(sizeof(**foo), elements + i);

【讨论】:

    【解决方案2】:

    您遇到了为未知数量的元素动态分配内存的问题。这里的关键是动态内存,因此您必须跟踪自己的内存块。您必须在某些时候使用 malloc()free()

    根据你的需要,elements类型,你可以做的是:

    1. 如果elements 是单个值,可能是整数。一个不错的选择是动态分配数组,代码 sn-p 参见Sergey's answer

    2. 如果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。那是链表的链表。

    您会在网络上找到大量的 C 链表实现。

    【讨论】:

      【解决方案3】:

      你不能像 foo1[elements+1] 那样静态分配 foo1,除非元素的值不是你只能在运行时知道的。 如果您确实知道想要的元素数量,而不是在声明中使用变量:

      #define ELEMENTS 10
      

      int foo[元素]; int foo1[元素+1];

      或者,如果您在运行时不会这样做,请使用动态内存分配

      int *foo, *foo1;
      
      foo = (int*)malloc(sizeof(int)* elements);
      foo1 = (int*)malloc(sizeof(int)*( elements+1 ) );
      

      别忘了释放你完成的内存:

      free(foo);
      free(foo1);
      

      【讨论】:

        猜你喜欢
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2012-08-16
        • 2019-12-15
        • 2012-03-21
        • 2014-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多