在初学数据结构时,我们往往不太清楚在定义一个结构体指针时要不要使用malloc函数。
例如以下的代码:
LINKLIST *init linklist()
{
LINKLIST *H=NULL;
LINKLIST *S;
int x;
printf("请输入链表元素 或以-1结束输入")
while(x!=-1)
{
s=(LINKLIST*)malloc(sizeof(LINKLIST));
s->data=x;
s->next=H;
H=s;
scanf(%d,&x);
}
retrun H;
}
在定义结构体指针变量S时需要用到malloc函数
而定义结构体指针变量H时则没有用到malloc函数
S和H的区别所在是:H没有指向有效地内存地址,而S指向了有效地内存地址,因为S指向了有效地内存地址所以可以往S指向的内存地址里面写值:S->data=x;而在后来H指向的地址就是每一个新的S指向的地址:H=S;
再举个例子
LINKLIST *S;
S->data=x;
以上这两句代码是不行的,因为S没有指向确切的地址,所以不能通过S来向它要指向的地址赋值;
但是
LINKLIST *S;
LINKLIST P;
S=&P;
S->data=x;
是可以的,因为S指向P的地址,S->data=x;等同于p.data=x;
而malloc的作用就类似以上代码的作用;但是不用再定义一个结构变量P,再让结构体指针变量S指向它的地址&P,而是直接使用malloc函数让结构体指针变量S指向一个确切的内存地址。
LINKLIST *s;
s=(LINKLIST*)malloc(sizeof(LINKLIST));
s->data=x;
再举一个简单的例子
int * i;
*i=1;
错误
而
int * i;i=(int*);
i=malloc(sizeof(int));
*i=1;
确是正确的