C语言--指针
关于C语言指针问题开展的研究:
创立一个如下链表节点
typedef struct linknode
{
int data;
struct linknode *next;
}LinkList;
开始测试三种InitList()函数:(采用如下主函数)
int main(void)
{
LinkList *L;
L=NULL;//第二次测试时,//L=NULL,只函数来进行初始化
InitList(L);//涉及到InitList(2)时改为,L=InitList(L);
L->data=4;
printf("%d",L->data);
free(L);
return 0;
}
对于InitList(1):
void InitList(LinkList *p)
{
printf("1#");//判断自定义函数是否成功运行,下同
p=(LinkList*)malloc(sizeof(LinkList));
printf("2#");
p->next=NULL;
printf("3#");
}
预期结果:1#2#3#4
第一次测试结果:1#2#3# InitList(1)成功运行,但是L->data“无效”
第二次测试结果:1#2#3# InitList(1)成功运行,但是L->data“无效”
对于InitList(2):
LinkList* InitList(LinkList *p)
{
printf("1#");
p=(LinkList*)malloc(sizeof(LinkList));
printf("2#");
p->next=NULL;
printf("3#");
return p;
}
预期结果:1#2#3#4
第一次测试结果:1#2#3#4 InitList(2)成功运行,且L->data“有效”
第二次测试结果:1#2#3#4 InitList(2)成功运行,且L->data“有效”
对于InitList(3):
void InitList(LinkList *p)
{
printf("1#");
LinkList *q;
q=(LinkList*)malloc(sizeof(LinkList));
printf("2#");
q->next=NULL;
printf("3#");
p=q;
printf("4#");
}
第一次测试结果:1#2#3#4#4
第一次测试结果:1#2#3#4# InitList(3)成功运行,但是L->data“无效”
第二次测试结果:1#2#3#4# InitList(3)成功运行,但是L->data“无效”
看到这里也许你们会和我一样产生这样疑问:为什么(1)(3)的L初始化没有成功?我用的是指针啊?难道是定义没初始化吗?(这里我令L=NULL,进行了第二次测试,这里可能有人会说在main()中直接令L=(LinkList*)malloc(sizeof(LinkList));那么InitList(1)(3)也许就行了。事实上的确可以成功运行。)还是我自定义函数出错了?(因为本人太菜,所以以至于自我怀疑了,看了一些书和网上的一些关于C语言自定义的InitList(),发现没有关于这方面的相关知识。而且书上和网上看到的void InitList(LinkList *&p)(号称C语言可使用,但是当我用C语言编译器尝试编译却显示编译失败,事实上当我将它用于oj上时,提交C语言无法编译,提交c++通过了!!!))
综上所述,我认为应该是L初始化出现了问题,但也不完全是,实际上是L没有指向自定义函数中所开辟的空间。(因为malloc()开辟的空间要求free(()来释放否则会一直存在)具体怎么来解释还请大神评论告知,本人将不胜感激。

浙公网安备 33010602011771号