如何声明从结构到最终数组的指针

时间:2019-08-14 09:38:59

标签: c pointers

我想制作一个结构体数组,问题是何时每个单个结构体具有不同大小的数组。 我试图建立一个指向数组的指针,但我不明白这一点。

typedef struct {

    char *opcodeName;

    int   opcodeNumber;

    int   howManyOprendsNeeded;

    int   *sourceAddressingMode;

    int   *destAddressingMode;

}Opcode;
typedef enum {

  IMMEDIATE, DIRECT, INDEX, REGISTER

}ADDRESSING_MODE;
static const Opcode opcodes[] = {

        {"mov", 0, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{DIRECT , INDEX , REGISTER}   },
        {"cmp" ,1, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER}, {IMMEDIATE ,DIRECT , INDEX , REGISTER}},
        {"add" ,2, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{DIRECT , INDEX , REGISTER }    },
        {"sub" ,3, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{ DIRECT , INDEX , REGISTER}   },
        {"not" ,4, 1, {-1}                                   , {DIRECT , INDEX , REGISTER}  },
        {"clr" ,5, 1, {-1}                                   , {DIRECT , INDEX , REGISTER} },
        {"lea" ,6, 2, {DIRECT,INDEX}                         , {DIRECT , INDEX , REGISTER}   },
        {"inc" ,7, 1, {-1}                                   , {DIRECT , INDEX , REGISTER} },
        {"dec" ,8, 1, {-1}                                   , {DIRECT , INDEX , REGISTER} },
        {"jmp" ,9, 1, {-1}                                   , {DIRECT ,REGISTER}  },
        {"bne" ,10, 1,{-1}                                   , {DIRECT , REGISTER}  },
        {"red" ,11, 1,{-1}                                   ,  {DIRECT , INDEX , REGISTER}  },
        {"prn" ,12, 1,{-1}                                   , {IMMEDIATE ,DIRECT , INDEX , REGISTER}  },
        {"jsr" ,13, 1,{-1}                                   , {DIRECT , REGISTER}  },
        {"rts" ,14, 0,{-1}                                  , {-1}},
        {"stop",15, 0,{-1}                                  , {-1}},


};

如果不知道大小,如何从strcut声明数组。 我得到的错误: 1.从'int'初始化'int *'会使指针从整数开始,而不会因{IMMEDIATE,DIRECT,INDEX,REGISTER}引起的转换[-Wint-conversion]。 2.标量初始化程序中的多余元素。由{-1}引起。

2 个答案:

答案 0 :(得分:1)

如果要将初始化元素分配给指针,则需要将其视为复合文字。

示例:

更改

{"mov", 0, 2, {IMMEDIATE ,DIRECT , INDEX , REGISTER},{DIRECT , INDEX , REGISTER}   },

{"mov", 0, 2, (int []){IMMEDIATE ,DIRECT , INDEX , REGISTER}, (int []){DIRECT , INDEX , REGISTER}   },
  

注意:: (int [])将具有本地范围并正在访问它们   超出范围是不确定的行为。

答案 1 :(得分:1)

首先,我认为当我不得不编译您的代码时,我曾发出过很多警告,如果我是您,我会尽量避免这些警告,墙警告不是错误,但有些是并且是调试的好方法。 大多数错误是: incompatible integer to pointer conversion initializing 'int *' with an expression of type 'int'

一种可能对我来说很有意义的方法是,正如您事先知道的,用这种方式声明它们的数组大小:

int   sourceAddressingMode[4];

int   destAddressingMode[4];

但不是最佳选择。

对我来说最好的方法是使用二进制运算符:

您的操作码变为:

typedef enum {

IMMEDIATE 0, DIRECT 1, INDEX 2, REGISTER 4

}ADDRESSING_MODE;

您的sourceAddressingMode和destAddressingMode的类型为int。

声明很简单,看起来像

{"mov", 0, 2, {IMMEDIATE | DIRECT | INDEX | REGISTER},{DIRECT | INDEX | REGISTER}   },

要知道第一个操作码的示例具有一个DIRECT的sourceAddressingMode,可以使用具有以下内容的'&'运算符:

if (Opcode[0].sourceAddressingMode & DIRECT)
  //do stuff
希望会有所帮助,我很高兴知道kiran Biradar会如何考虑此解决方案而不是强制转换。欢呼