将值写入其他变量后函数中的C自由整数数组
在将数组元素中的值赋给整型变量后,我想释放函数中分配给int数组的内存 我有密码:将值写入其他变量后函数中的C自由整数数组,c,arrays,malloc,free,C,Arrays,Malloc,Free,在将数组元素中的值赋给整型变量后,我想释放函数中分配给int数组的内存 我有密码: int u(int n) { int* values = (int*)malloc(sizeof(int)*n + 1); int out = 0; for (int i = 0; i < 3; i++) values[i] = 1; if (n < 3) return 1; else { for (
int u(int n)
{
int* values = (int*)malloc(sizeof(int)*n + 1);
int out = 0;
for (int i = 0; i < 3; i++)
values[i] = 1;
if (n < 3)
return 1;
else
{
for (int i = 3; i <= n; i++)
values[i] = values[i - values[i - 1]] + values[i - values[i - 2]];
}
out = values[n];
free(values);
return out;
}
intu(intn)
{
int*值=(int*)malloc(sizeof(int)*n+1);
int out=0;
对于(int i=0;i<3;i++)
数值[i]=1;
if(n<3)
返回1;
其他的
{
对于(int i=3;i请记住sizeof(int)*n+1
等于(sizeof(int)*n)+1
。您为n
整数值分配空间,再加上一个字节
这意味着else
案例中的循环将写越界(除非sizeof(int)==1
,即使在历史上,任何平台都很少有这样的情况)。而写越界分配的内存将导致
通常,越界写入会弄乱内存分配器使用的私有和内部数据,导致调用free
时出现问题
解决方案是更改分配以便分配n+1
整数(即sizeof(int)*(n+1)
),或者将循环条件更改为i
记住sizeof(int)*n+1
等于(sizeof(int)*n)+1
。为n
整数值分配空间,再加上一个字节
这意味着else
案例中的循环将写越界(除非sizeof(int)==1
,即使在历史上,任何平台都很少有这样的情况)。而写越界分配的内存将导致
通常,越界写入会弄乱内存分配器使用的私有和内部数据,导致调用free
时出现问题
解决方案是更改分配,使其分配n+1
整数(即sizeof(int)*(n+1)
)。或者将循环条件更改为i
,请查看注释
int u(int n)
{
if (n < 3) // moved it here. If n it's smaller you have a smaller array; move it ahead of malloc/free’s
return 1;
int* values = (int*)malloc(sizeof(int)*(n + 1));
int out = 0;
for (int i = 0; i <= n; i++)
{
if(i<3)
values[i] = 1;
else
values[i] = values[i - values[i - 1]] + values[i - values[i - 2]]; // this is suspicious; what do you want to obtain ?
}
out = values[n];
if(values!=NULL)
free(values);
return out;
}
intu(intn)
{
if(n<3)//将其移到这里。如果n较小,则具有较小的数组;将其移到malloc/free的前面
返回1;
int*值=(int*)malloc(sizeof(int)*(n+1));
int out=0;
对于(int i=0;i请查看注释
int u(int n)
{
if (n < 3) // moved it here. If n it's smaller you have a smaller array; move it ahead of malloc/free’s
return 1;
int* values = (int*)malloc(sizeof(int)*(n + 1));
int out = 0;
for (int i = 0; i <= n; i++)
{
if(i<3)
values[i] = 1;
else
values[i] = values[i - values[i - 1]] + values[i - values[i - 2]]; // this is suspicious; what do you want to obtain ?
}
out = values[n];
if(values!=NULL)
free(values);
return out;
}
intu(intn)
{
if(n<3)//将其移到这里。如果n较小,则具有较小的数组;将其移到malloc/free的前面
返回1;
int*值=(int*)malloc(sizeof(int)*(n+1));
int out=0;
对于(inti=0;我为什么你说你不能这样做?如果你试图创建斐波那契数,我想你会很快用这个代码得到负指数值[i]=values[i-values[i-1]]+values[i-values[i-2]]比如当你达到i=6,你会得到值[6]=values[6-8]+values[6-5]=values[-2]+值[1]。你必须像值[i]=值[i-1]+值[i-2];这不是斐波那契数,它类似于Fib:u(n-u(n-1))+u(n-u(n-2))。对于i=6,我有值[6]=值[6-值[5]+值[6-值[4]],其中值[5]=3,值[4]=3,所以我没有负索引。值[3]=值[n-值[2]+值[n-values[1]]=values[3-1]+values[3-2]=1+1=2为什么你说你不能这么做?如果你试图创建斐波那契数,我想你会很快用这个代码得到负指数值[i]=values[i-values[i-1]+values[i-values[i-2]]说当你达到i=6,你会得到值[6]=values[6-8]+values[6-5]=values[-2]+values[1]。你必须像values[i]=values[i-1]+values[i-2];这不是斐波那契数,它类似于Fib:u(n-u(n-1))+u(n-u(n-2))。对于i=6,我有值[6]=values[6-values[5]+values[6-values[4]],其中值[5]=3,值[4]=3],所以我没有负指数。值[3]这句话的意思是:谢谢你对我的解释,这句话的意思是:谢谢你对我的解释,这句话的意思是:谢谢你对我的解释,这句话的意思是:谢谢你对我的解释,这句话的解释很有帮助这是CodeWars的任务,我需要实现类似于斐波那契级数的函数:u(n-u(n-1))+u(n-u(n-2))。1)根据您的建议,它看起来更好。谢谢。我更正了我的代码。2)这是CodeWars的任务,我需要实现类似于斐波那契级数的函数:u(n-u(n-1))+u(n-u(n-2))。