free函数出现端点

采用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;
}



img

可能是你在访问的时候越界了,然后你多分配一个空间,就没发生越界,然后就没报错。
你可以看下我博客中动态内存管理的那篇博客,里面有更详细的介绍