我正在尝试实现一种处理页面错误的替换算法。所以我正在尝试使用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("%d\n", temp->use); //hi
}
return 0;// bye
}
所以我不应该这样使用malloc吗?
答案 0 :(得分:2)
将结构定义更改为
struct pageInMemory{
int use;
int reference;
int free;
struct pageInMemory* next;
};
让您的代码正常运行。 仅供参考do not typecast void* coming from malloc。
答案 1 :(得分: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;
...
对于第3个选项,您可以使用:
nn = malloc(sizeof(pageInMemory));
或
nn = malloc(sizeof(struct pageInMemory));
后一种变化我觉得非常恼火,因为有两个不同的东西有一个名字:
struct pageInMemory
pageInMemory
我不建议使用第3个选项,但第二个选项。
答案 2 :(得分:1)
pageInMemory
本身被定义为类型。所以,而不是这个,
nn = (struct pageInMemory *)malloc(sizeof(struct pageInMemory))
使用此,
nn = (pageInMemory *)malloc(sizeof(pageInMemory))