#include <stdio.h> #include <stdlib.h> typedef struct SeqList{ char data; struct SeqList *next; }SeqList; int InitList(SeqList *l) { l=(SeqList *)malloc(sizeof(SeqList)); if(l!=NULL) { l->next=NULL; return 1; } return 0; } void CreatList(SeqList *l) { if(l->next==NULL) printf("yes\n"); } int main() { SeqList l; InitList(&l); CreatList(&l); return 0; }
只想问,为什么打印不出来yes
解决方案
20
int InitList(SeqList *l) { l=(SeqList *)malloc(sizeof(SeqList));
最后一句是修改这个参数本身,而不是传递过来的参数,可以试试
int InitList(SeqList *l) { l->next =(SeqList *)malloc(sizeof(SeqList));
20
#include <stdio.h>
#include <stdlib.h>
typedef struct SeqList{
char data;
struct SeqList *next;
}SeqList;
int InitList(SeqList **l)
{
*l=(SeqList *)malloc(sizeof(SeqList));
if(l!=NULL)
{
(*l)->next=NULL;
return 1;
}
return 0;
}
void CreatList(SeqList *l)
{
if(l->next==NULL)
printf(“yes\n”);
}
int main()
{
SeqList *l;
InitList(&l);
CreatList(l);
return 0;
}
#include <stdlib.h>
typedef struct SeqList{
char data;
struct SeqList *next;
}SeqList;
int InitList(SeqList **l)
{
*l=(SeqList *)malloc(sizeof(SeqList));
if(l!=NULL)
{
(*l)->next=NULL;
return 1;
}
return 0;
}
void CreatList(SeqList *l)
{
if(l->next==NULL)
printf(“yes\n”);
}
int main()
{
SeqList *l;
InitList(&l);
CreatList(l);
return 0;
}
50
lz犯了一个错误, 参数的传递只是传递一个副本,对于InitList来说, SeqList *l 这个只是 main 那个 l 的副本, 所以调用InitList后, main中的那个l, 并没有改变。由于在初始化时, l 的内容可能被初始化为0xcccccccc, 所以createLIst中打印不出来yes. 这样改
int InitList(SeqList **l) { (*l)=(SeqList *)malloc(sizeof(SeqList)); if((*l)!=NULL) { (*l)->next=NULL; return 1; } return 0; } void CreatList(SeqList *l) { if(l->next==NULL) printf("yes\n"); } int main() { SeqList *l; InitList(&l); CreatList(l); return 0; }
P.S. 不要单字母命名变量, 特别是用l
///
20
要通过InitList函数来修改main函数里的l的指向
必须传二级指针或一级指针的引用,光传一级指针是没有用的(一级指针指向修改指针所指向的区域)
(原因是main函数的l和InitList函数的形参l他们仅仅是指向同一块内存区域,
但两者本身并不是同一个指针,所以你对InitList函数的l进行操作是影响不到main函数的l的)
必须传二级指针或一级指针的引用,光传一级指针是没有用的(一级指针指向修改指针所指向的区域)
(原因是main函数的l和InitList函数的形参l他们仅仅是指向同一块内存区域,
但两者本身并不是同一个指针,所以你对InitList函数的l进行操作是影响不到main函数的l的)