为什么 free() 会影响其他变量的值?

Why free() impact other variable's value?

"Distinct Subsequences"在线练习:

Given a string S and a string T, count the number of distinct subsequences of T in S.

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ACE" is a subsequence of "ABCDE" while "AEC" is not).

Here is an example:
S = "rabbbit", T = "rabbit"

Return 3.

下面列出了我的代码。

对于测试用例{s="aaaaaaaaaaaaa", t="aa"}:

如果我在最终 return 之前启用 //free(pMtx);,我的代码将被视为失败,结果为 79

如果我将此 free(pMtx); 注释掉,我的结果是正确的 78

然后我在本地 PC 上试了一下,启用 free(pMtx); 一切正常。

所以我真的很困惑为什么会这样?

int numDistinct(char* s, char* t) {
    int slen=strlen(s);
    int tlen=strlen(t);
    if( (0 == slen) || (0 == tlen)||(tlen>slen))
        return 0;

    int* pMtx = (int*)malloc(slen*tlen*sizeof(int));

    for(int ss=0; ss<slen; ss++)
    {
        if(0==ss)
        {
            pMtx[0] = (s[0]==t[0]) ? 1 : 0;
            continue;
        }

        for(int tt=0; tt<tlen; tt++)
        {
            int cur = ss*tlen + tt;

            if(tt>ss)
            {
                pMtx[cur]=0;
                continue;
            }

            int v1 = (tt==0) ? 1 : pMtx[cur-tlen-1];
            int vv = v1 + pMtx[cur-tlen];

            if(s[ss]==t[tt])
                pMtx[cur] = (vv>=pMtx[cur-tlen]) ? vv : pMtx[cur-tlen];
            else
                pMtx[cur] = pMtx[cur-tlen];
        }
    }

    int rst = pMtx[slen*tlen-1];

    //free(pMtx);  //------------> open it will result in wrong rst value ???

    return rst;    
}

问题出在这里:

    if(0==ss)
    {
        pMtx[0] = (s[0]==t[0]) ? 1 : 0;
        continue;
    }

您需要将 pMtx[0] 初始化为 pMtx[tlen-1],而不仅仅是第一个元素。

第一次分配内存时,它通常会被清零(因为 OS 可能在将它交给进程之前已经完成了)。当你释放内存时,它可以在你下次分配内存时被重用,然后它就不会再为零了。因此,如果您从 main 多次调用此函数,它会解释失败的原因。