c - 使用数组初始值设定项作为静态数组

标签 c arrays segmentation-fault

是否可以将数组初始值设定项用作数组(有点像字符串文字?)

#define TETRAMINO_I {{1,1,1,1},{0,0,0,0}}

printf("%c",(TETRAMINO_I[0][0]) ? "#" : ' ');

(这段代码显然行不通。

我想出了以下解决方案(绕过这个要求)

#define TETRAMINO_I {{1,1,1,1},{0,0,0,0}}
#define TETRAMINO_J {{1,1,1,0},{0,0,1,0}}
#define TETRAMINO_L {{1,1,1,0},{1,0,0,0}}
#define TETRAMINO_O {{1,1,0,0},{1,1,0,0}}
#define TETRAMINO_S {{0,1,1,0},{1,1,0,0}}
#define TETRAMINO_T {{1,1,1,0},{0,1,0,0}}
#define TETRAMINO_Z {{1,1,0,0},{0,1,1,0}}

typedef unsigned char byte;

typedef struct tetraminos{
    char I[2][4];
    char J[2][4];
    char L[2][4];
    char O[2][4];
    char S[2][4];
    char T[2][4];
    char Z[2][4];

}tet_minos_t;

tet_minos_t tet_mino_blocks{ TETRAMINO_I,TETRAMINO_J,TETRAMINO_L,TETRAMINO_O,TETRAMINO_S,TETRAMINO_T,TETRAMINO_Z};

使用结构的全局实例。但是,在尝试使用时:

newMino->blocks = (char**)tet_mino_blocks.I;
printf("%c",(newMino->blocks[0][0]) ? "#" : ' ');

我无法打印(出现段错误)

最佳答案

是的,有点,但是你必须给你的数组一个类型。从 C99 开始,我们有了复合文字:

#define TETRAMINO_C ((unsigned char const[][4])TETRAMINO_I)

这为数组提供了 const 限定类型(语法上类似于强制转换)。该类型是 const 限定的,因此如果必须的话,编译器对如何分配数组的限制较少。允许为数组的所有使用分配一个静态副本。

但是,如果您仅按照 TETRAMINO_C[0][0] 中的说明使用它,现代 C 编译器的体面优化器应该能够完全优化数组并且只直接使用常量.

关于c - 使用数组初始值设定项作为静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974244/

相关文章:

java数组索引越界

c++ - 复制数组

c++ - 在 C++ 中将 int 转换为字节数组

c - 全局结构数组

c - 如何让我的 C 程序忽略空格(空格、制表符、换行符)?

c - 在 C 中添加对换行符 (\n) 的支持

python - 更快地填写列表

c - 当我再次 malloc 时,free(struct variable) 不会清除与该变量关联的先前存储的值?

使用 c 将数组和指针复制到源的最后一个元素之后

android - 在模拟器下运行金鱼内核的段错误