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

标签 c free

“不同子序列”在线练习:

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="aaaaaaaaaaaa", 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;    
}

最佳答案

问题出在这里:

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

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

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

关于c - 为什么 free() 会影响其他变量的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30435452/

相关文章:

c - 递归函数返回值

c - 如何使用 printf 检查 void 函数是否成功运行?

c - 递归程序中编译器的优化

c - 项目的内存分配和释放包装器

C++ 释放静态变量

C 链表 - 何时释放分配的内存

从 C 语言的 dll 文件(用 VB 编写)调用 COM 组件

c - C中的自由指针是什么?

c - 循环内的内存初始化 : Segmentation fault on free

释放后检查结构体是否释放