【问题标题】: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 * 类型的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多