2014-09-06 67 views
0

类似于一维数组声明:ç二维数组静态初始化与保存大小

char arr[]={[0 ... RESERVED_CHARS-1]=' ',[RESERVED_CHARS]='\0'}; 

请指教如何/是否可能宣布这样的二维数组?

#define SAY_MAX_MSG_LEN 6 
#define REP_MAX_MSG_LEN 8 

char *var_msg_out[][3]={\ 
    {" Say ",[][0 ... SAY_MAX_MSG_LEN+1]=' ','\0'},\ 
    {" Reply ",[][0 ... REP_MAX_MGS_LEN+1]=' ','\0'}\ 
}; 
snprintf(var_msg_out[0][1],SAY_MAX_MSG_LEN,"hello"); 
printf("%s",var_msg_out[0]); 

谢谢!

+0

*“类似一维数组声明” *,这是一维数组有效的C? – 2014-09-06 12:25:44

+2

@皮特斯:我也很惊讶。显然这是一个GCC扩展:https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html(它也适用于Clang)。 – 2014-09-06 12:37:38

回答

2

你有什么只有一部分是这样的:

char *var_msg_out[][3]={ 
    {" Say ",[][0 ... SAY_MAX_MSG_LEN+1]=' ','\0'}, 
      ^??? 

这里有一个根本性的问题:后“说”是char*的元素,但您要分配给它,仿佛它是一个char数组。两者不是一回事:你的char*可以指向没有问题的文字字符串(比如“说”),但是你不能初始化它的字符,因为没有什么可以初始化 - 只有一个指针!

你能解决这个问题是这样的:

struct foo { 
    const char* x; 
    char y[100]; 
    const char* z; 
}; 

struct foo var_msg_out[]={ 
    {" Say ", {[0 ... SAY_MAX_MSG_LEN+1]=' '}, ""}, 
    {" Reply ", {[0 ... REP_MAX_MSG_LEN+1]=' '}, ""} 
}; 
+0

你说得对我的(简写)例子错误。 但是,分配char y [100]的解决方案;是不希望的。 我正在寻找具体的原因来对齐解决方案,以1D为例。 – Vlad 2014-09-06 17:44:10

+1

没有这样的解决方案是可能的,因为C中的多维数组永远不会稀疏也不会参差不齐,这意味着每个维度必须具有相同的固定长度。你可以像我一样设置一个固定长度,或者你可以回到使用'char *'作为第二列,并为它分配存储空间。可以使用'malloc()'或某些堆栈分配的字符串池,并将矩阵第二列中的指针设置为指向外部动态大小的数组。 – 2014-09-07 01:07:13

+0

感谢您的时间和解释。 – Vlad 2014-09-07 06:35:36