-5

如何即时创建 C 变量名称?可以做到吗?这比我之前想象的要棘手。

我的具体情况是这样的:

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

  • 我希望它们被命名为:{ a1, a2, a3... a n }

显然,动态创建数组内容很容易,但动态命名数组似乎很棘手。老实说,我现在什至没有办法。欢迎任何建议。

4

7 回答 7

4

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

于 2013-02-18T21:39:24.617 回答
3

程序编译后不能生成 C 变量。为了在运行时创建命名事物,您需要一个动态数据结构,如字典。

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

于 2013-02-18T21:34:28.707 回答
2

好吧,如果你真的需要这样一个可怕的 hack,你似乎需要重新设计你的代码。或者你只是想索引数组?

int arr[128];

int foo = array[3];
于 2013-02-18T21:35:02.773 回答
1

不会。一旦编译了 C 程序,变量名(和类型等)就会被删除。

于 2013-02-18T21:34:35.410 回答
1

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

但是,在我看来,您要创建的是数组数组。在那种情况下,a将是一个数组数组,并且每个a[n]数组都是它自己的数组。

于 2013-02-18T21:38:36.893 回答
1

您不能在运行时创建新的变量名称。

每当你说“我需要 N 个名为 a1、a2、a3、... aN 的东西”之类的话时,你真正想要的是一系列东西a[N]:在这种情况下,您说您想要 N 个名为 a1、a2、a3...aN 的数组,所以您真正需要的是一个数组数组: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用作常规的二维数组:

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

等当你完成它时,一定要释放数组:

free(arrs);

请注意,此示例与错误处理没有任何相似之处;您肯定要测试scanfandmalloc调用的结果。

于 2013-02-18T21:53:31.923 回答
1

这实际上与 John Bodes 的答案相同,但有一个完整的代码示例。

约翰·博德写道:

您不能在运行时创建新的变量名称。

每当你说“我需要 N 个名为 a1、a2、a3、... 在这种情况下,您说您想要 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,
于 2013-02-18T22:14:32.377 回答