将值写入其他变量后,C 在函数中释放 int 数组
C free int array in function after writing value to other variable
我想在将数组元素的值赋值给整型变量后释放函数中分配给 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;
}
为什么我不能在将值写入另一个变量后释放分配给数组的内存?
int out 有另一个地址然后分配内存,我想要做的只是将数组中的值赋给另一个变量。有人可以解释一下为什么我做不到吗?
请记住 sizeof(int)*n + 1
等于 (sizeof(int)*n) + 1
。您为 n
个整数值分配 space,加上一个 byte.
这意味着您在 else
情况下的循环 将 写出边界(除非 sizeof(int) == 1
很少有平台,即使在历史上也是如此)。超出已分配内存范围的写操作会导致 undefined behavior.
通常,越界写入会弄乱内存分配器使用的私有数据和内部数据,导致调用 free
.
时出现问题
解决方案是更改分配,以便分配 n + 1
个整数(即 sizeof(int) * (n + 1)
)。或者将循环条件更改为 i < n
.
看看评论。
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;
}
我想在将数组元素的值赋值给整型变量后释放函数中分配给 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;
}
为什么我不能在将值写入另一个变量后释放分配给数组的内存? int out 有另一个地址然后分配内存,我想要做的只是将数组中的值赋给另一个变量。有人可以解释一下为什么我做不到吗?
请记住 sizeof(int)*n + 1
等于 (sizeof(int)*n) + 1
。您为 n
个整数值分配 space,加上一个 byte.
这意味着您在 else
情况下的循环 将 写出边界(除非 sizeof(int) == 1
很少有平台,即使在历史上也是如此)。超出已分配内存范围的写操作会导致 undefined behavior.
通常,越界写入会弄乱内存分配器使用的私有数据和内部数据,导致调用 free
.
解决方案是更改分配,以便分配 n + 1
个整数(即 sizeof(int) * (n + 1)
)。或者将循环条件更改为 i < n
.
看看评论。
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;
}