【问题标题】:struct self referencing结构自引用
【发布时间】:2012-08-14 04:46:35
【问题描述】:

我到处都有语法错误,对 ADT 和内存处理的语法理解不佳。我需要一个在nextprev 中引用自身(其他部分)的结构。我做对了吗?我收到错误...

struct _header * header;

typedef struct _header {
    int signiture;
    int size;
    header_t* next;
    header_t* prev;
} header;

我还想用标头初始化内存中的前 32 个字节(这也不太顺利..):

//this is to reference the memory block later
static int *free_list_ptr;

void function(u_int32_t size){
    memory = (byte*) malloc(size);
    header firstHead = malloc(sizeof(_header));
   free_list_ptr = firstHead = memory;
   firstHead->prev = free_list_ptr;
   firstHead->next = free_list_ptr;
}

【问题讨论】:

    标签: c pointers struct dynamic-memory-allocation


    【解决方案1】:

    你不能在创建 typedef 时引用它,所以你应该这样做:

    typedef struct a_header {
        int signiture;
        int size;
        struct a_header* next;
        struct a_header* prev;
    } header;
    
    header* the_header;
    

    避免使用下划线开头的名称 - 它们是为系统保留的。

    【讨论】:

      【解决方案2】:

      请试试这个:

      typedef struct _header *lpheader;
      
      typedef struct _header {
          int signiture;
          int size;
          lpheader next;
          lpheader prev;
      } header, *lpheader;
      

      另外,为什么这个结构需要 32 字节的空间?你应该使用sizeof(_header)

      【讨论】:

      • @Havelock 同意,但除非结构中的每个元素都是 8 字节,否则这将造成严重破坏。 :P
      【解决方案3】:

      您的想法太复杂了,您的typedef 为时已晚,并且您在struct 的声明中使用了错误的名称。

      typedef struct header header; // <- forward declare "struct header" and identifier "header"
      
      struct header {
          int signiture;
          int size;
          header* next;
          header* prev;
      };
      

      对于续集,我真的不明白你想做什么。可以肯定的是,您在那里使用了未声明的奇怪名称,并且您将malloc 的返回值进行了转换。

      【讨论】:

        【解决方案4】:

        这是您当前的问题。

        memory = (byte*) malloc(size); 
        header firstHead = malloc(sizeof(header)); 
            free_list_ptr = firstHead = memory; 
        

        您分配size 并将其位置作为byte* 存储到memory

        然后您(正确地)分配一个header 结构,并将该空间的分配存储到firstHead

        然后通过将firstHead 设置为memory 大小错误的分配空间,然后将free_list_ptr 设置为相同大小错误的分配空间,将其丢弃(泄漏内存)。

        由于您当前的指针没有足够的内存,当您尝试使用nextprev 的偏移量时会遇到麻烦。

        我怀疑你需要这个:

        memory = null; 
        header firstHead = malloc(sizeof(header)); 
        memory = free_list_ptr = firstHead; 
        

        这会将指针memoryfree_list_ptr 设置为指向firstHead 指向的分配空间。

        我不知道您为什么使用两个不同的指针来跟踪memoryfree_list_ptr。我的直觉是,其中 1 个可能足以满足您的目的。

        【讨论】:

        • 如果我将大小分配更改为 _header 它会正常工作吗?
        • 我已经用我认为您需要的内容更新了我的帖子。总之,您需要让memory 不分配您不会使用的空间,并将其和free_list_ptr 设置为firstHead
        猜你喜欢
        • 2016-12-23
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多