#include <stdio.h>
#include <stdlib.h>
// squeue list operator
#define MAXSIZE 100
typedef int Dataype;
typedef struct
{
Dataype data[MAXSIZE];
int length;
}Sqlist;
// init a sqlist
void Init_sqlist(Sqlist *list)
{
list = (Sqlist *)malloc(sizeof(Sqlist));
if (NULL == list)
{
perror("Init_sqlist error");
exit(-1);
}
list->length = 0;
}
// append element to sqlist
void Append_sqlist(Sqlist *list,Dataype x)
{
printf("length %d\n", list->length);
if (MAXSIZE !=list->length)
{
list->data[list->length] = x;
list->length++;
}
}
// print sqlist
void Print_sqlist(Sqlist *list)
{
int i;
if (0 != list->length)
{
for (i = 0; i < list->length; ++i)
{
printf("%d ", list->data[i]);
}
printf("\n");
}
else
printf("empty\n");
}
int main(int argc, char const *argv[])
{
int i;
Sqlist *list2=NULL;
Init_sqlist(list2);;
for (i = 0; i < 10; ++i)
{
Append_sqlist(list2,i);
}
Print_sqlist(list2);
system("pause");
return 0;
}
问题出在 Init_sqlist 这里,输入的参数是一个 Sqlist 指针,但是函数里只改变了形参,没能改变实参,所以在 main 中执行 Init_sqlist(list2) 后 list2 仍然是 NULL。这一点只需要在后面加一句话就看得到,
printf("list2 is %d\n", list2)
有两种改法,第一种是改变 Init_sqlist 的参数类型为 Sqlit**
void Init_sqlist(Sqlist **pList)
{
Sqlist * list;
list = (Sqlist *)malloc(sizeof(Sqlist));
if (NULL == list)
{
perror("Init_sqlist error");
exit(-1);
}
list->length = 0;
(*pList) = list;
}
调用
// Init_sqlist(list2);;
Init_sqlist(&list2);
第二种是改变 Init_sqlist 为创建函数,即加返回值
Sqlist* Init_sqlist()
{
Sqlist* list;
list = (Sqlist *)malloc(sizeof(Sqlist));
if (NULL == list)
{
perror("Init_sqlist error");
exit(-1);
}
list->length = 0;
return list;
}
调用
// Sqlist *list2=NULL;
// Init_sqlist(list2);;
Sqlist *list2 = Init_sqlist();
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。