将"sizeof"应用于不完整的类型列表结构 C 无效



我正在尝试实现一个处理页面错误的替换算法。所以我试图使用malloc创建一个循环链表,我得到以下错误:"sizeof' to incomplete type pageInMemory的无效应用程序"。代码如下:

 typedef  struct {
            int use; 
            int reference;
            int free;
            struct pageInMemory* next;
            } pageInMemory;

            int main()
            {
                int i;
                struct pageInMemory* start, *nn, *temp, *hand;
                start = NULL;
                    for(i=0; i< pNum; i++) 
                    {
                nn = (struct pageInMemory *)malloc(sizeof(struct pageInMemory));
                        nn->use = 0;
                        nn->free = 1;
                        if(start==NULL)
                        {
                            nn->next = nn;
                            start =nn;
                        }
                        else
                        {     // sfhsdifhsdifj sdijfjsd 
                            temp = start;
                            while(temp->next != start)
                            {
                                temp = temp->next; 
                            }
                            temp->next = nn;
                            nn->next = start;
                            start = nn;
                        }   
                    }

                hand = start;
                temp = start;
             while(temp->next != start->next)
             {
                printf("%dn", temp->use); //hi
             } 

                return 0;// bye
             }  

那么我不应该这样使用malloc吗?

将struct定义更改为

struct pageInMemory{
            int use;
            int reference;
            int free;
            struct pageInMemory* next;
            };

让你的代码工作。只是为了你的信息不要类型转换void*来自malloc。

pageInMemory本身定义为type。所以不用这个

nn = (struct pageInMemory *)malloc(sizeof(struct pageInMemory))

使用这个,

nn = (pageInMemory *)malloc(sizeof(pageInMemory))

应该是:

typedef  struct pageInMemory_s {
        int use; 
        int reference;
        int free;
        struct pageInMemory_s * next;
        } pageInMemory;
pageInMemory* start, *nn, *temp, *hand;
... 
nn = malloc(sizeof(pageInMemory));

struct pageInMemory {
        int use; 
        int reference;
        int free;
        struct pageInMemory* next;
        };
struct pageInMemory* start, *nn, *temp, *hand;
... 
nn = malloc(sizeof(struct pageInMemory));

第三个变体是:

typedef  struct pageInMemory {
        int use; 
        int reference;
        int free;
        struct pageInMemory * next;
        } pageInMemory;
pageInMemory* start, *nn, *temp, *hand;
... 

对于第三个选项,你可以使用:

nn = malloc(sizeof(pageInMemory));

nn = malloc(sizeof(struct pageInMemory));

后一种变化我觉得很恼火,因为两个不同的东西有一个名字:

    struct pageInMemory 结构定义/声明
  • 类型定义/声明pageInMemory
我不建议使用第三个选项,而是第二个。

相关内容

  • 没有找到相关文章

最新更新