3

我正在尝试实现一种处理页面错误的替换算法。所以我正在尝试使用 malloc 创建一个循环链表,我收到以下错误:“ sizeof' to incomplete typepageInMemory 的无效应用程序”。以下是代码:

 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("%d\n", temp->use); //hi
             } 


                return 0;// bye
             }  

所以我不应该这样使用 malloc 吗?

4

3 回答 3

2

将您的结构定义更改为

struct pageInMemory{

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

让你的代码工作。并且只是为了您的信息,不要对来自 malloc 的 void* 进行类型转换

于 2013-06-20T10:43:47.540 回答
1

pageInMemory本身定义为类型。所以代替这个,

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

用这个,

nn = (pageInMemory *)malloc(sizeof(pageInMemory))
于 2013-06-20T10:35:37.747 回答
1

它应该是:

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

我不建议使用第三个选项,而是第二个。

于 2013-06-20T10:34:42.210 回答