C 中的 typedef、数组和指针

typedef, arrays and pointers in C

正在研究一个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 变量赋值,而无需在我的结构中将其声明为指针?

The thing that I don't understand is, what is the type of data?

data 的类型是指向 two-dimensional 数组的指针。即uint8_t(*data)[4][4].

请参阅 C right-left rule 来解读 C 声明。

Plus, I want to assign values to this variable st.data = (int8_t *)array.

在这种情况下 array 必须与 uint8_t[4][4] 数组具有相同的布局。由于数组在 C 中是连续的,因此 array 必须至少有 4 * 4 个 int8_t.

类型的元素

您必须将 array 转换为 (uint8_t*) 的事实首先意味着 array 具有不同的类型,这可能会导致麻烦。

请注意,这只是一个指针赋值,不是 array 的 element-wise 副本。

is it possible to assign values to my data_t variable without declaring it as a pointer in my structure?

如果 data 不是指针,则可以,即声明为 data_t data;。然后使用 memcpy.

复制到其中

这个声明

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].

相同

所以它是一个指向 two-dimensional 类型对象指针数组的指针 uint8_t

数组没有赋值运算符。您必须将一个数组的元素复制到另一个数组中。

例如,如果您有另一个 one-dimensional 指针数组,例如

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 *.

类型对象的位置分配内存