【问题标题】:C programming Circular list for memory suballocator用于内存子分配器的 C 编程循环列表
【发布时间】:2012-08-18 17:44:52
【问题描述】:

我正在尝试构建一个内存子分配器。下面的代码有一些错误,它告诉我:

free_list_ptr->next = &firstByte;
free_list_ptr->prev = &firstByte;

收到warning: assignment from incompatible pointer type 的 gcc 错误警告

//primitive variable of byte as char, always positive.
typedef unsigned char byte;
static byte *memory = NULL;

struct header;

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


static header *free_list_ptr;


void allocator_init(u_int32_t size){

    memory = (byte*) malloc(size);

    //initialize free_list_ptr;
    free_list_ptr = (header*) memory;

        header* firstByte = (header*) memory;

    free_list_ptr->size = size;

    //error here: warning: assignment from incompatible pointer type
    free_list_ptr->prev = &firstByte;
    free_list_ptr->next = &firstByte;
}

【问题讨论】:

  • 啊,我现在才看到你基本上问了两次同样的问题。不要那样做。这对已经尝试回答您的第一个问题的人非常不礼貌。标记为主持人注意最终合并这两个问题。
  • 是的,但是之前的第一个问题没有得到回答,并且由于记过代表而丢失了。为“更新”问题太早了。

标签: c memory-management linked-list circular-list


【解决方案1】:

这很可能是错误的:

struct header;               // forward declare "struct header"

typedef struct _header {
    int signiture;
    int size;
    struct header* next;     // refer to the forward declared "struct header"
    struct header* prev;
} header;                    // declare type-alias "header"

改为

typedef struct header header; // forward declaration of both

struct header {
    int signiture;
    int size;
    header* next;
    header* prev;
};

在 C 中 struct headertypedefed header 存在于两个不同的名称空间中。您转发声明了struct header,但您从未定义它。

另外,以_ 开头的标识符通常是为内部保留的,所以你不应该将它们用于你自己的东西。

【讨论】:

    【解决方案2】:

    改变

       free_list_ptr->prev = &firstByte;
    

      free_list_ptr->prev = firstByte;
    

    【讨论】:

      【解决方案3】:

      &firstByteheader**free_list_ptr->prevheader*

      您可以通过以下方式解决您的问题(您肯定会摆脱警告):

      free_list_ptr->prev = firstByte;
      free_list_ptr->next = firstByte;
      

      【讨论】:

        【解决方案4】:

        这应该是

        free_list_ptr->prev = firstByte;
        free_list_ptr->next = firstByte;
        

        由于 next 和 prev 已经是头指针,给它们分配另一个头指针(firstByte)的地址会导致错误。

        【讨论】:

          猜你喜欢
          • 2020-09-28
          • 2013-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-04
          • 2021-05-18
          • 2019-03-31
          • 1970-01-01
          相关资源
          最近更新 更多