繁体   English   中英

地址指针转换为结构

[英]adress pointer cast to struct

我在结构中使用指针时遇到问题。

我有一个数据库,每个条目都被声明为结构(其中成员代表 db-item)。

现在我想将每个解析的条目打印到文件中,并且必须使用指针指向数据库中的特定条目。 下面的代码片段诅咒了这个问题:

/* print database entries */
    i = 0;
    while (i < *(uint32_t *)(*ptr_to_s_20b_parse_entries + 0xc)) {
      ptr_s_db_entry = *(s_db_entry **)(ptr_to_s_20b_parse_entries[2] + i * 4);
      if (ptr_s_db_entry->show == 0) {
        printf("[%3d] [%s] [%s]\n",i,ptr_s_db_entry->ptr_e_title,ptr_s_db_entry->ptr_e_text);
      }
      i = i + 1;
    }
  }
  return;

错误:

[错误] 's_db_entry' 未声明(在此函数中首次使用)

声明了以下变量:

  struct s_db_entry *ptr_s_db_entry;

struct s_db_entry {
    byte show; // 0 = show, 1 = don't show
    byte strlen_e_title;
    short strlen_e_text;
    int *ptr_e_title;
    int *ptr_e_text;
};

ptr_to_s_20b_parse_entries 是来自调用者的参数。

已经谢谢你了!

你需要

(struct s_db_entry **)

代替

(s_db_entry **)

因为它不是typedef的。

除非您没有显示该部分, s_db_entry不是代码中的类型

在代码中

 ptr_s_db_entry = *(s_db_entry **)(ptr_to_s_20b_parse_entries[2] + i * 4);

需要改为

ptr_s_db_entry = *(struct s_db_entry **)(ptr_to_s_20b_parse_entries[2] + i * 4);
                   ^^^^^^

[错误] 's_db_entry' 未声明(在此函数中首次使用)

对此有一些建议。 更改定义以创建结构的typedef将解决该问题。 改变这个:

struct s_db_entry {
    byte show; // 0 = show, 1 = don't show
    byte strlen_e_title;
    short strlen_e_text;
    int *ptr_e_title;
    int *ptr_e_text;
};

对此:(也建议在此处更改名称。)

//typedef struct s_db_entry {//name tag may be unnecessary at this point 
typedef struct {
    byte show; // 0 = show, 1 = don't show
    byte strlen_e_title;
    short strlen_e_text;
    int *ptr_e_title;
    int *ptr_e_text;
}db_entry_s;//note, typedef symbol is unique from name tag if both are to be used. 

这当然需要

(struct s_db_entry **)

变成这样:

(db_entry_s **)

(请注意,看到后缀_s来指示结构typedef比例如前置s_更常见。)

同样在您的代码中,您显示此声明struct s_db_entry ptr_s_db_entry; 在定义被引用的实际结构之前。 它应该放在struct (或struct typedef ,如果您选择使用该方法)定义之下。

typedef struct {
    byte show; // 0 = show, 1 = don't show
    byte strlen_e_title;
    short strlen_e_text;
    int *ptr_e_title;
    int *ptr_e_text;
}db_entry_s;

db_entry_s *ptr_db_entry_s;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM