如何即时创建 C 变量名称?可以做到吗?这比我之前想象的要棘手。
我的具体情况是这样的:
我正在创建n 个数组,其中n是用户输入。
我希望它们被命名为:{ a1, a2, a3... a n }
显然,动态创建数组内容很容易,但动态命名数组似乎很棘手。老实说,我现在什至没有办法。欢迎任何建议。
这听起来像你只需要你的阵列上的另一个维度......或者类似的东西,至少。
程序编译后不能生成 C 变量。为了在运行时创建命名事物,您需要一个动态数据结构,如字典。
也就是说,也许您实际上并不需要命名的变量,在这种情况下,您需要动态分配的数组。由于您实际上无法在运行时创建变量,因此命名问题变得没有意义。
好吧,如果你真的需要这样一个可怕的 hack,你似乎需要重新设计你的代码。或者你只是想索引数组?
int arr[128];
int foo = array[3];
不会。一旦编译了 C 程序,变量名(和类型等)就会被删除。
在 C 中,变量名是编译时的东西,而不是运行时的东西。当您编译代码时,它们通常被替换为内存地址和偏移量。
但是,在我看来,您要创建的是数组数组。在那种情况下,a
将是一个数组数组,并且每个a[n]
数组都是它自己的数组。
您不能在运行时创建新的变量名称。
每当你说“我需要 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);
请注意,此示例与错误处理没有任何相似之处;您肯定要测试scanf
andmalloc
调用的结果。
这实际上与 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,