我试图用这个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|
我正在搜索一段时间,一切都说这是如何做2d char数组的严格方法。为什么会抛出错误?
答案 0 :(得分:3)
"this is a string"
和
'o' /* this is a character */
答案 1 :(得分:2)
#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'}};
此外,初始化程序必须在编译期间定义,而不是在运行时期间,否则它将是一个动态数组,您需要手动分配内存。
答案 2 :(得分:2)
在C中,您不能将动态表达式用作全局变量的数组大小。自C99标准以来,局部变量是可能的,但是这些称为VLA
的数组无法初始化。
出于您的目的,您必须直接使用文字常量或常量表达式指定大小。您可以使用宏来提高可读性,但#define x 4
不是一个好主意,因为x
之类的短标识符可能会在您的程序中的其他位置使用,也会被替换,从而导致隐藏的错误。
您不能使用每个char
的字符串初始化char
的2D数组,您可以这样使用字符文字:
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
如果确实需要将大小设置为动态,则需要以其他方式初始化数组:
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
。
答案 3 :(得分:1)
通常,您需要在声明矩阵时定义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] );
}