【问题标题】:How to declare pointer from struct to final array如何声明从结构到最终数组的指针
【发布时间】:2019-12-20 20:36:04
【问题描述】:

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

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} 引起。

【问题讨论】:

  • 你不能这样初始化指针。可以使用compound literals 使指针指向一个数组(例如(int[]){ ... }),但是这个初始化必须在文件范围内,否则数组将在它定义的块结束时结束它的生命。
  • 最简单的解决方案是让sourceAddressingModedestAddressingMode 成为固定最大大小的数组。然后根据需要尽可能多地使用它们。它们目前不是数组,而是指针,鉴于您提供的这个初始化列表,这没有意义。

标签: c pointers


【解决方案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}   },

例如,您的第一个操作码有一个直接的 sourceAddressingMode,您可以使用“&”运算符,例如:

if (Opcode[0].sourceAddressingMode & DIRECT)
  //do stuff

希望这会有所帮助,我很高兴知道 kiran Biradar 对这个解决方案而不是演员表的看法。干杯

【讨论】:

    【解决方案2】:

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

    示例:

    改变

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

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

    注意:: (int []) 将具有本地范围并访问它们 在其范围之外是未定义的行为。

    【讨论】:

    • 注意static 限定符。如果这是一个本地 static 变量,则无法将其初始化为指向复合文字。只有在文件范围内声明它才会起作用。
    • 关于注释:(int []) 没有范围,因为它没有名称。范围是 where 在源代码中 identifier 可见。生命周期是在程序执行期间存在一个对象。不能“在其范围之外”访问对象的说法是错误的,因为在其生命周期内调用的子例程可以访问对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多