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

时间:2015-05-25 09:47:04

标签: c free

练习"不同的子序列"在线:

  

给定一个字符串S和一个字符串T,计算S中T的不同子序列的数量。

     

字符串的子序列是一个新字符串,它是由原始字符串形成的,删除一些(可以是无)字符,而不会干扰其余字符的相对位置。 (即" ACE"是" ABCDE"" AEC"不是)的子序列。

     

这是一个例子:
  S =" rabbbit",T ="兔子"

     

返回3.

我的代码如下所示。

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

如果我在最终返回前启用//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;    
}

1 个答案:

答案 0 :(得分:3)

问题在于:

pMtx[0]

您需要将pMtx[tlen-1]初始化为import matplotlib.pyplot as plt plt.plot([8.714871428, 8.618221961,8.338674976,7.904714805,6.73505356,6.08059523,5.423472376,4.785585409,3.615895343]) plt.ylabel(r'$\frac{\kappa}{C} \rho$') plt.show() ,而不仅仅是第一个元素。

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