realloc函数调用时出现堆错误!

luther_k 2014-07-06 10:44:43
代码实现顺序表的初始化和建立,在建立(CreateList)过程中,当调用realloc来扩充内存块容量时,出现错误:
代码如下:
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

#define LIST_INIT_SIZE 10
#define LISTINCREMENT 5

typedef int ElemType;

typedef struct
{
ElemType *elem;
int length;
int listsize;
} SqList;

void InitList(SqList **L)
{
(*L)->elem = (ElemType *)malloc(sizeof(ElemType));
if(!(*L)->elem)
return;
else
{
(*L)->length = 0;
(*L)->listsize = LIST_INIT_SIZE;
}
}

void CreateList(SqList *L)
{
ElemType val;
int i;

val = rand() % 100;
for(i = 0; i < 30; i++)
{
if(L->length >= L->listsize)
{
L->elem = (ElemType *)realloc(L->elem, L->listsize + LISTINCREMENT * sizeof(ElemType));

if(!L->elem)
return;
else
{
L->listsize += 1;
}
}
else
{
L->elem[L->length] = val;
L->length++;
}
val = rand() % 100;
}
}



int main(void)
{
SqList *list;
list = (SqList *)malloc(sizeof(SqList));
InitList(&list);
CreateList(list);
return 0;
}

请问如何解决!
...全文
204 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
luther_k 2014-07-07
  • 打赏
  • 举报
回复
引用 1 楼 brookmill 的回复:
L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType)); 用了malloc就要有free
但是我这个顺序表要一直保存着的,我后面还会对其进行其他的操作的,不能free掉吧
dragonno1 2014-07-07
  • 打赏
  • 举报
回复
代码的意图看的一头雾水。 不过19行分配了4个字节的空间给(*L)->elem , 50行给L->elem[L->length] 赋值,从第2个循环起就已经越界了,到后面第10个循环realloc的时候,判断这个指针不是有效的堆指针,然后崩溃了。
cyd54454 2014-07-07
  • 打赏
  • 举报
回复
37行-47行,看了看,如果没理解错,是有问题的。你增加了LISTINCREMENT * sizeof(ElemType)空间,后面的 L->listsize怎么只加1呢。listsize应该是记录数组大小的,length应该是记录数组实际存在的元素个数的吧

       if(L->length >= L->listsize)
        {
            L->elem = (ElemType *)realloc(L->elem, L->listsize  + LISTINCREMENT * sizeof(ElemType));
                       
            if(!L->elem)
                return;
            else
            {
                L->listsize += LISTINCREMENT ;
            }
        }
cyd54454 2014-07-07
  • 打赏
  • 举报
回复
void CreateList(SqList *L)里,for第二次循环,数组L->elem[L->length]就越界了。初始化的时候,应该(*L)->elem = (ElemType *)malloc(sizeof(ElemType) *LIST_INIT_SIZE ),开辟一个10个整型大小的空间,才符合你的本意
brookmill 2014-07-06
  • 打赏
  • 举报
回复
还有个小问题,用rand()之前要先用srand()设种子
brookmill 2014-07-06
  • 打赏
  • 举报
回复
L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType)); 用了malloc就要有free

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧