如何动态创建C变量名?可以吗?这比我之前想象的要复杂得多。
我的具体案例是:
我正在创建 n 数组,其中 n 是用户输入。
我希望他们的名字如下:{a1,a2,a3 ... a n }
显然,动态制作数组内容很容易,但对于名称,动态数组似乎很棘手。老实说,我现在甚至没有办法。欢迎任何建议。
答案 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);
请注意,此示例没有类似错误处理的内容;您需要确保测试scanf
和malloc
来电的结果。
答案 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,