Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将值写入其他变量后函数中的C自由整数数组_C_Arrays_Malloc_Free - Fatal编程技术网

将值写入其他变量后函数中的C自由整数数组

将值写入其他变量后函数中的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数组的内存

我有密码:

 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))。