【问题标题】:c 2d array static initialization with preserved sizec 保留大小的二维数组静态初始化
【发布时间】:2014-10-31 05:42:18
【问题描述】:

类似于一维数组声明:

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

谢谢!

【问题讨论】:

标签: c multidimensional-array static-allocation


【解决方案1】:

您拥有的唯一部分是:

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

这里有一个基本问题:“Say”之后的元素是char*,但您却试图将其分配给它,就好像它是一个字符数组一样。两者不是一回事:您的 char* 可以毫无问题地指向文字字符串(例如“ Say ”),但您不能初始化它的字符,因为没有什么要初始化的——只有一个指针!

你可以这样修复它:

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]=' '}, ""}
};

【讨论】:

  • 您对我的(简短编写的)示例错误是正确的。但是,分配 char y[100] 的解决方案;是不希望的。我正在寻找将解决方案与 1D 示例对齐的具体原因。
  • 不可能有这样的解决方案,因为 C 中的多维数组从不稀疏也不参差不齐,这意味着每个维度必须具有相同的固定长度。您可以像我一样设置固定长度,也可以返回使用char* 作为第二列并在外部为其分配存储空间。使用malloc() 或一些堆栈分配的字符串池,并将矩阵第二列中的指针设置为指向外部那些动态大小的数组。
  • 感谢您的时间和解释。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 2020-10-30
  • 2012-07-12
  • 2018-03-04
相关资源
最近更新 更多