初始化2d字符数组

时间:2015-11-21 12:17:25

标签: c arrays

我试图用这个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数组的严格方法。为什么会抛出错误?

4 个答案:

答案 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;
        }
    }
    ...
}

您仍然需要注意此功能:您必须检查用户输入,以避免在自动存储中分配太多数据(也称为堆栈中的 )。 xy的足够大或可能为负的值将调用未定义的行为。只允许小值,通常小于256.对于更通用的解决方案,您需要从堆中分配plg

答案 3 :(得分:1)

通常,您需要在声明矩阵时定义rowscols,例如:

#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'}};

现在,如果您需要rowscols作为输入变量,则需要动态允许该数组。例如,

#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] );
}