当前位置: 技术问答>linux和unix
新手提问c语言指针
来源: 互联网 发布时间:2016-03-28
本文导语: 在Linux下面实现链表的时候,遇到了以下错误,请各位指教 struct MessageElem//链表元素 { char str[STRLEN]; int class; MessageElem *next; }; typedef MessageElem MegElm; struct MessageList//链表 { MegElm *head; MegElm *tail; int ListLength;...
在Linux下面实现链表的时候,遇到了以下错误,请各位指教
struct MessageElem//链表元素
{
char str[STRLEN];
int class;
MessageElem *next;
};
typedef MessageElem MegElm;
struct MessageList//链表
{
MegElm *head;
MegElm *tail;
int ListLength;
};
typedef MessageList MegList;
然后我使用如下:
MegList* MList;//定义一个链表指针
MegList* MList = (MegList*)malloc(sizeof(MegList));//分配地址
MegElem* MElm;//定义一个成员
MElm = (MegElm *)malloc(sizeof(MegElm));
再对其进行操作
MList->heat->next = MElm; //出错语句
就在上面这句指针赋值语句上出现了dereferencing pointer to incomplete type
请问是为什么?
我猜测如下:
不可以用->->这种双指针来进行指向一个地址.
不知道对不对,如果确实是这种原因的话,那么如果我要对上面的next进行赋值操作的话,怎么实现指向他呢?
这里不讨论这种赋值是否合理性,只是想知道这里的语法规则
请各位指教,谢谢!!!
struct MessageElem//链表元素
{
char str[STRLEN];
int class;
MessageElem *next;
};
typedef MessageElem MegElm;
struct MessageList//链表
{
MegElm *head;
MegElm *tail;
int ListLength;
};
typedef MessageList MegList;
然后我使用如下:
MegList* MList;//定义一个链表指针
MegList* MList = (MegList*)malloc(sizeof(MegList));//分配地址
MegElem* MElm;//定义一个成员
MElm = (MegElm *)malloc(sizeof(MegElm));
再对其进行操作
MList->heat->next = MElm; //出错语句
就在上面这句指针赋值语句上出现了dereferencing pointer to incomplete type
请问是为什么?
我猜测如下:
不可以用->->这种双指针来进行指向一个地址.
不知道对不对,如果确实是这种原因的话,那么如果我要对上面的next进行赋值操作的话,怎么实现指向他呢?
这里不讨论这种赋值是否合理性,只是想知道这里的语法规则
请各位指教,谢谢!!!
|
首先一一列出楼主所示代码的语法错误:(具体如果解决就要根据楼主上下文的程序而定了)
1、
struct MessageElem//链表元素
{
char str[STRLEN];
int class;
MessageElem *next;
};
2、
typedef MessageElem MegElm;
同样的:typedef MessageList MegList;
3、
MegList* MList;//定义一个链表指针
MegList* MList = (MegList*)malloc(sizeof(MegList));//分配地址
4、
MegElem * MElm;//定义一个成员
5、
MList->heat->next = MElm; //出错语句
或许楼主的这些语法错误是在转CSDN时不小心造成的,不过还是请楼主细心一点,提问题不是一个人的事。
逻辑错误解决:
正如一楼所说,MList->head->next中head这个地址是没有初始化,不可预料的值,自然有问题了。
你可以这样:
MList->head= MElm;
MList->head->next= MElm;
就没有问题了。
1、
struct MessageElem//链表元素
{
char str[STRLEN];
int class;
MessageElem *next;
};
2、
typedef MessageElem MegElm;
同样的:typedef MessageList MegList;
3、
MegList* MList;//定义一个链表指针
MegList* MList = (MegList*)malloc(sizeof(MegList));//分配地址
4、
MegElem * MElm;//定义一个成员
5、
MList->heat->next = MElm; //出错语句
或许楼主的这些语法错误是在转CSDN时不小心造成的,不过还是请楼主细心一点,提问题不是一个人的事。
逻辑错误解决:
正如一楼所说,MList->head->next中head这个地址是没有初始化,不可预料的值,自然有问题了。
你可以这样:
MList->head= MElm;
MList->head->next= MElm;
就没有问题了。
|
是这样的。
MegList* MList = (MegList*)malloc(sizeof(MegList));//分配地址
你这句只申请了MessageList的地址。
MList->heat->next = MElm; //出错语句
这句就有错了。
如果是Mlist->head = MElm,不会有问题。
而你的MList->head->next相当于引用了MList->head所指向的地址,但是这个地址是没有初始化的,(这个指针就是野指针)。
你改变了该地址的内容,当然有问题了。
MegList* MList = (MegList*)malloc(sizeof(MegList));//分配地址
你这句只申请了MessageList的地址。
MList->heat->next = MElm; //出错语句
这句就有错了。
如果是Mlist->head = MElm,不会有问题。
而你的MList->head->next相当于引用了MList->head所指向的地址,但是这个地址是没有初始化的,(这个指针就是野指针)。
你改变了该地址的内容,当然有问题了。
|
语法规则没问题,是逻辑问题。
在纸上画个图,用箭头代替指针来回画画就知道该怎么做了。
在纸上画个图,用箭头代替指针来回画画就知道该怎么做了。
|
“悠悠长风”说得有道理,MList->head指向地址的没有分配内存,所以MList->head->next就会出错了。