在Linux下编写程序SqList.c如下
/**
*程序功能说明:顺序表初始化
*/
#include <stdio.h>
#include <stdlib.h>
/* In common use */
#define OVERFLOW -1
#define OK 1
#define LIST_INIT_SIZE 100 /* 线性表存储空间的初始分配量 */
#define LISTINCREMENT 10 /* 线性表存储空间的分配增量 */
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *elem; /* 存储空间基址 */ /*a、问题在这里*/
int length; /* 当前长度 */
int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */
}SqList;
Status InitList_Sq (SqList *L)
{
/* 构造一个空的线性表L。*/
(*L).elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (! (*L).elem) exit(OVERFLOW); /* 存储分配失败 */
(*L).length = 0; /* 空表长度为0 */
(*L).listsize = LIST_INIT_SIZE; /* 初始存储容量 */
return OK;
}/*InitList_Sq*/
int main()
{
int result = 0;
SqList *p = NULL; /*b*/
result = InitList_Sq(p);
printf(“The result is %d.\n”, result);
free(p);
exit(0);
}
编译后执行程序时出现错误,错误代码:
Segmentation fault
用gdb调试run指令提示如下:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005b5 in InitList_Sq (L=0×0) at SqList.c:21
21 (*L).elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
查阅相关资料都说和指针未初始化,在我程序b处已经初始化p为NULL。请问这个问题该如何解决?
好长时间不用C了,都忘光啦!
>> 本文固定链接: http://www.vcgood.com/archives/3215
b处不能赋值为NULL,因为没有为它动态分配内存。
这样,也就不能用free(p)了,应该改为free(p.elem)。
自己马虎了,不要见怪!
InitList_Sq
FreeList_Sq
写函数写成配对的就想malloc/free等,可以少出很多错误.