刚学的数据结构的线性存储到我这怎么失灵了?
帮忙看下这个程序 预料之内 程序崩溃了 程序为什么P->elem就不能分配动态内存了?
# include <stdio.h>
# include <stdlib.h>
# define LIST_INIT_SIZE 3
# define LISTINCREMENT 1
typedef struct
{
int * elem;
int length;
int listsize;
}Splist;
Splist * InitList_Sp(void)
{
Splist * p;
p->elem = (int *)malloc(LIST_INIT_SIZE * sizeof(int));
if (!p->elem)
{
printf("分配失败");
exit(-1);
}
for (int i=0; i<LIST_INIT_SIZE; i++)
{
printf("请输入第%d个元素的值:", i+1);
scanf("%d", &p->elem[i]);
}
p->length = LIST_INIT_SIZE;
p->listsize = LIST_INIT_SIZE;
return p;
}
void ListInsert_Sp(Splist *p, int i, int val)
{
if (p->length>=p->listsize)
{
p->elem = (int *)realloc(p->elem, (p->listsize+LISTINCREMENT) * sizeof(int));
if (!p->elem)
{
printf("分配失败");
exit(-1);
}
p->length += LISTINCREMENT;
}
int * q = &(p->elem[i-1]);
for (int * s = &(p->elem[p->length-1]); s >= q; --s)
*(s+1) = *s;
*q = val;
++p->length;
return;
}
void output(Splist * p)
{
int i = 0;
while (i<p->length)
{
printf("%d\t", p->elem[i]);
i--;
}
printf("\n");
}
int main()
{
Splist * p = NULL;
p = InitList_Sp();
//printf("%p,%p,%p\n", p.elem, &p.length, &p.listsize);
int val, i;
printf("请输入要插入元素的位置:");
scanf("%d", &i);
if (i<1 || i>p->length+1)
printf("插入元素位置错误.插入失败.\n");
else
{
printf("请输入要插入元素的数据:");
scanf("%d", &val);
ListInsert_Sp(p, i, val);
printf("插入成功.\n");
}
//system("pause");
output(p);
return 0;
}
[解决办法]
Splist * p; // p没有初始化,指向有效的空间或者对象
p->elem
p没有指向有效的对象就使用是不可以的,这种行为
[解决办法]
单步调试一下,看看指针是否有效,要学会调试。。。