[英]Initialize 2d array of chars
我试图用这个 ode 初始化 2d 字符数组
int x=4;
int y=4;
char plg[x][y]={{"o","o","o","o"},{"o","o","o","o"},{"o","o","o","o"},{"o","o","o","o"}};
但是这段代码抛出错误error: excess elements in char array initializer|
我搜索了一段时间,一切都说这是如何做二维字符数组的正确方法。 为什么会抛出错误?
在 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'
初始化第一个子数组,剩下的 3 个用'\\0'
初始化
如果您确实需要动态的大小,则需要以其他方式初始化数组:
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
或y
值将调用未定义的行为。 只允许使用较小的值,通常小于 256。对于更通用的解决方案,您需要从堆中分配plg
。
"this is a string"
和
'o' /* this is a character */
#define N_ROWS 4
#define N_COLS 4
你必须用 ' (single) 替换 " 因为它不是字符串而是字符:
char plg[N_ROWS][N_COLS]={{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'}};
此外,必须在编译时而不是在运行时定义初始值设定项,否则它将是一个动态数组,您需要手动为其分配内存。
通常你需要定义rows
和cols
声明矩阵时,如:
#define N_ROWS 4
#define N_COLS 4
char plg[N_ROWS][N_COLS]={{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'},{'o','o','o','o'}};
现在,如果你需要rows
和cols
作为输入变量,你需要动态允许阵列。 例如,
#include <stdlib.h>
#include <string.h>
int x = 4;
int y = 4;
char **plg = malloc(sizeof(char *) * x);
int i = 0;
for( i = 0; i < x; i++ )
{
plg[i] = malloc(sizeof(char) * (y + 1)); // +1 for NULL terminator
}
for( i = 0; i < x; i++ )
{
strcpy( plg[i], "oooo" );
printf( "%s \n", plg[i] );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.