采用malloc分配内存后,使用free释放next指针出现端点
#include
#include
#include
typedef int Status;
typedef struct HString //定义堆分配串
{
char* ch;
int length;
}HString;
Status StrAssign(HString& T, char* chars) //生成值等于常量chars的串
{
if (T.ch)
{
free(T.ch);
T.ch = NULL;
}
int i = 0;
char * p = chars;
for (i = 0; *p; i++,p++);
if (!i)
{
T.ch = NULL;
T.length = 0;
}
else
{
T.ch = (char*)malloc(sizeof(char) * i);
if (!T.ch) exit(-1);
for (int j = 0; j < i; j++)
{
T.ch[j] = chars[j];
}
T.length = i;
}
return 1;
}
Status StrCompare(HString S, HString T) //比较两个串大小,按照ASSCII码
{
for (int i = 0; i < S.length && i < T.length; i++)
{
if (S.ch[i] != T.ch[i])
return S.ch[i] - T.ch[i];
}
return S.length - T.length;
}
Status ClearString(HString& S) //将S清为空串
{
if (S.ch)
{
free(S.ch);
S.ch = NULL;
}
S.length = 0;
return 1;
}
Status get_next(HString T,int* &next ) //得到KMP中的next函数值指针
{
int i = 0,j=-1;
*(next+i) = -1;
while (i < T.length)
{
if (j == -1 || T.ch[i ] == T.ch[j])
{
i++;
j++;
*(next+i) = j;
}
else
j = *(next+j);
}
return 1;
}
Status Index_KMP(HString S, HString T, int *next) //KMP算法匹配成功返回位置,否则-1
{
int i = 0, j =0;
while (i < S.length && j<T.length)
{
if (j == -1|| S.ch[i] == T.ch[j])
{
i++; j++;
}
else
j = *(next+j);
}
if (j >= T.length) return i-T.length;
else return -1;
}
int main(int argc ,char *argv[])
{
if (argc != 3) //检查输入是否合法
{
printf("ERROR_01");
return -1;
}
char* s = argv[1]; //主串指针
char* p = argv[2]; //模式串指针
HString T = { NULL,0 }, S = { NULL,0 };
StrAssign(S, s); //初始化主串
StrAssign(T, p); //初始化模式串
int* next =(int*)malloc(sizeof(int) * T.length); //定义next函数值指针
if (!next) return -1;
get_next(T,next);
if (!next) return -1;
if (Index_KMP(S,T,next)!= -1)
{
printf("%d", Index_KMP(S, T, next) +1); //匹配成功
}
else //匹配失败
printf("-1");
ClearString(S);
ClearString(T);
free(next);
return 0;
}
可能是你在访问的时候越界了,然后你多分配一个空间,就没发生越界,然后就没报错。
你可以看下我博客中动态内存管理的那篇博客,里面有更详细的介绍