【问题标题】:typedef, arrays and pointers in CC中的typedef,数组和指针
【发布时间】:2016-04-26 13:18:45
【问题描述】:
我正在研究用 C 语言编写的代码。
以下部分我不清楚:
typedef uint8_t data_t[4][4];
typedef struct {
data_t *data;
...
} my_struct;
我不明白的是,data 的类型是什么?
另外,我想给这个变量赋值。
例如,代码中有:
my_struct st;
st.data = (int8_t *)array
其中数组定义为int8_t *array。
我不明白这个分配是如何工作的,有人可以解释清楚吗?
最后,是否可以将值分配给我的 data_t 变量而不将其声明为结构中的指针?
【问题讨论】:
标签:
c
arrays
casting
typedef
c-preprocessor
【解决方案1】:
我不明白的是,数据的类型是什么?
data 的类型是一个指向二维数组的指针。那是uint8_t(*data)[4][4]。
请参阅 C right-left rule 了解 C 声明的解密。
另外,我想给这个变量赋值st.data = (int8_t *)array。
在这种情况下,array 必须与 uint8_t[4][4] 数组具有相同的布局。由于数组在C 中是连续的,因此array 必须至少有4 * 4 个int8_t 类型的元素。
您必须首先将array 与(uint8_t*) 一起转换这一事实意味着array 具有不同的类型,这可能会导致麻烦。
请注意,这只是一个指针分配,而不是 array 的元素副本。
是否可以为我的 data_t 变量赋值而不将其声明为结构中的指针?
如果data 不是指针是可能的,即将它声明为data_t data;。然后使用memcpy复制到其中。
【解决方案2】:
此声明
typedef uint8_t data_t[4][4];
将名称 data_t 声明为类型 uint8_t [4][4] 的别名。
因此在结构定义中
typedef struct {
data_t *data;
...
} my_struct;
成员数据是data_t *类型的指针,与uint8_t ( * )[4][4]相同。
所以它是一个指向 `uint8_t 类型对象的指针的二维数组的指针
数组没有赋值运算符。您必须将一个数组的元素复制到另一个数组中。
例如,如果您有另一个一维指针数组,例如
uint8_t *array[4];
你可以写
my_struct st;
st.data = malloc( sizeof( data_t ) );
memcpy( st.( *data )[0], array, 4 * sizeof( uint8_t * ) );
考虑到data 是一个指针,您首先要分配内存,您将在其中复制uint8_t * 类型的对象。