在 C 中,不能使用动态表达式作为全局变量的数组大小。自 C99 标准以来,局部变量是可能的,但这些数组称为VLA
无法初始化。
出于您的目的,您必须直接使用文字常量或常量表达式指定大小。您可以使用宏来增加可读性,但这是一个坏主意#define x 4
像这样的短标识符x
可能会在程序的其他地方使用,并且也会被替换,从而导致模糊的错误。
您无法初始化二维数组char
每个人都有一个字符串char
,您可以这样使用字符文字:
char plg[4][4] = {
{'o','o','o','o'},
{'o','o','o','o'},
{'o','o','o','o'},
{'o','o','o','o'}
};
或者您可以使用字符串文字来初始化数组的最后一层:
char plg[4][4] = {"oooo", "oooo", "oooo", "oooo" };
请注意,虽然您可以使用以下命令删除内部大括号char
文字初始化器是这样的:
char plg[4][4] = {'o','o','o','o','o','o','o','o','o','o','o','o','o','o','o','o' };
不可能以这种方式合并字符串初始值设定项:
char plg[4][4] = { "oooooooooooooooo" }; // warning: initializer-string for char array is too long
上面的语法仅初始化第一个子数组'o'
s,剩下的 3 个初始化为'\0'
s
If you really如果需要动态大小,您将需要以其他方式初始化数组:
void myfunc(int x, int y) {
char plg[x][y];
int scores[x][y];
// you can initialize char arrays this way
memset(plg, 'o', sizeof(plg));
// you need a loop for other types
for (int i = 0; i < x; i++) {
for (int j = 0; j < y; j++) {
scores[i][j] = 1;
}
}
...
}
您仍然需要小心使用此功能:您必须检查用户输入,避免在自动存储(又名在堆栈上)。足够大或可能为负值x
or y
将调用未定义的行为。只允许使用较小的值,通常小于 256。对于更通用的解决方案,您需要分配plg
从堆中。