如何动态创建变量名称

时间:2013-02-18 21:33:21

标签: c database struct naming

如何动态创建C变量名?可以吗?这比我之前想象的要复杂得多。

我的具体案例是:

  • 我正在创建 n 数组,其中 n 是用户输入。

  • 我希望他们的名字如下:{a1,a2,a3 ... a n }

显然,动态制作数组内容很容易,但对于名称,动态数组似乎很棘手。老实说,我现在甚至没有办法。欢迎任何建议。

7 个答案:

答案 0 :(得分:4)

这听起来像你需要在你的阵列上另一个维度...或者类似的东西,至少。

答案 1 :(得分:3)

编译程序后无法生成C变量。为了在运行时创建命名的 thing ,您需要一个像字典一样的动态数据结构。

也就是说,也许您实际上并不需要命名变量,在这种情况下,您需要动态分配的数组。由于您无法在运行时实际创建变量,因此命名问题没有实际意义。

答案 2 :(得分:2)

好吧,如果你真的需要这样糟糕的黑客,你似乎需要重新设计你的代码。或者你只是想索引数组?

int arr[128];

int foo = array[3];

答案 3 :(得分:1)

没有。编译C程序后,将删除变量名(和类型等)。

答案 4 :(得分:1)

在C中,变量名是编译时的东西,而不是运行时名。在编译代码时,它们通常会被内存地址和偏移量替换。

然而,在我看来,你想要创建的是一个数组数组。在那种情况下,a将是一个数组数组,每个a[n]都是一个自己的数组。

答案 5 :(得分:1)

您无法在运行时创建新的变量名称。

任何时候你说“我需要N个名为a1,a2,a3,...... aN的东西”,你真正要求的是一系列事物:a[N]。在这种情况下,你说你想要名为a1,a2,a3 ... aN的N个数组,所以你真正需要的是一个数组数组:a[N][M]

假设每个数组的大小在编译时是已知的,并且您需要的只是这些数组的数量,这就变得容易了:

#define M 10 // size of each array

int (*arrs)[M];  
size_t numArrs;

printf("Gimme the number of arrays:  ");
fflush(stdout);
scanf("%zu", &numArrs);

arrs = malloc(sizeof *arrs * numArrs);

此时,您可以将arrs用作常规2D数组:

arrs[i][j] = some_value();
printf("a[%d][%d] = %d\n", i, j, arrs[i][j]);

等。当你完成它之后,一定要释放阵列:

free(arrs);

请注意,此示例没有类似错误处理的内容;您需要确保测试scanfmalloc来电的结果。

答案 6 :(得分:1)

这与John Bodes的答案非常相似,但有一个完整的代码示例。

John Bode写道:

  

您无法在运行时创建新的变量名称。

     

任何时候你说“我需要N个名为a1,a2,a3,...... aN的东西”,你真正要求的是一系列事物:a [N]。在这种情况下,你说你想要N个数组名为a1,a2,a3 ... aN,所以你真正要求的是一个数组数组:a [N] [M]。

     

假设每个数组的大小在编译时是已知的,并且您需要的只是这些数组的数量,这就变得容易了:

#include <stdlib.h>
#include <stdio.h>
#define ARRAY_DEPTH 3
int main( int argc, char * argv[])
{
  if( argc != 2 )
  {
    fprintf(stderr,"%s: Usage %s <number of arrays>\n",
        argv[0], argv[0]);
    return 1;
  }

  int i,j;
  int n = atoi(argv[1]);
  int (*arrays)[ARRAY_DEPTH];
  arrays = malloc(sizeof(int)*n*ARRAY_DEPTH);

  /* Do your stuff */

  for(i = 0; i < n; i++)
  {
    for(j = 0; j < ARRAY_DEPTH; j++) 
    {
      fprintf(stderr,"%3d,",arrays[i][j]);
    }
    fprintf(stderr,"\n");
  }
  free( arrays);
  return 0;
}

输出

$ ./narray 5
0,  0,  0,
0,  0,  0,
0,  0,  0,
0,  0,  0,
0,  0,  0,