为什么 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 多次调用此函数,它会解释失败的原因。
"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 多次调用此函数,它会解释失败的原因。