c - 在保存有条件分配内存的指针上使用 free 时,程序有时会崩溃
问题描述
这是一个简单的代码,只是为了说明我正在处理的问题。
如果输入n = 3并将数组元素输入为 1, 2 ,3和m= 0程序崩溃!!!
为什么会这样??问题是由于最后两行涉及 free()
现在我的问题是为什么会发生这种情况?如果删除自由语句,具有相同输入的相同程序不会崩溃......
请解释一下。是不是有条件的内存分配导致了上述问题的发生? 如果是,那为什么?
我没有得到任何提示,而且据我所知,免费(NULL)不会导致任何错误,因此当我尝试释放其中一个分配的内存时会引起问题,尤其是在我的输入中是积极的......
这是我的代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("Enter elements into the array\n");
int arr[n];
int i;
for(i=0;i<n;)
{
printf("arr[%d] ? ",i);
scanf("%d",(arr+i));
if(i>0)
{
if(arr[i]<arr[i-1])
continue;
else
i++;
}
else
i++;
}
int m;
printf("m ? ");
scanf("%d",&m);
int j,flag=0;
int *positive,*negative;
int start,end;
start=arr[0];
end=arr[n-1];
if(start<0 && end<0)
{
negative=(int*)calloc((start*-1),sizeof(int));
positive=0;
}
else if(start<0 && end>0)
{
negative=(int*)calloc((start*-1),sizeof(int));
positive=(int*)calloc(end,sizeof(int));
}
else if(start>=0 && end >0)
{
negative=0;
positive=(int*)calloc(end,sizeof(int));
}
int p=0;
for(i=0;i<n;i++)
{
if(i==0)
p=-1;
else
p=i;
if(arr[i]<0)
negative[-arr[i]]=p;
else
positive[arr[i]]=p;
}
for(i=0;i<n;i++)
{
int num=m-arr[i];
if(negative!=0 && num<0 && negative[-num])
{
if(negative[-num]==-1)
j=0;
else
j=negative[-num];
printf("%d %d\n",i,j);
flag=1;
}
else if(positive!=0 && num>=0 && positive[num])
{
if(positive[num]==-1)
j=0;
else
j=positive[num];
printf("%d %d\n",i,j);
flag=1;
}
}
if(flag==0)
printf("NO SUCH i j EXISTS\n");
if(positive) free(positive);
if(negative) free(negative);
return 0;
}
这是我的输出:
解决方案
使用您提到的输入值,您首先要执行以下操作:
end=arr[n-1];
positive=(int*)calloc(end,sizeof(int));
鉴于n == 3
and ,您为 分配了一个 3 sarr[n-1] == 3
的数组。int
positive
在下一个循环中,您最终会执行以下操作:
positive[arr[i]]=p;
它试图覆盖positive[3]
(何时i == n-1
)。这是试图写入超出数组的范围(有效索引范围从0
到2
only),然后出现未定义的行为,这意味着在那之后任何事情都可能发生,包括崩溃。
推荐阅读
- node.js - 如何在下一个 js 会话中存储大数据或使用会话文件存储?
- android - 从二维码获取结果后自动发送短信到手机号码
- maven - swagger-maven-plugin 没有生成@ApiResponse 方案
- reactjs - 如何从同一个组件调度多个动作?
- android - 如何在片段内使用地图
- powerapps - 用于打开特定表单的功能区按钮
- excel - 根据下拉列表 [Excel] 从按钮单击将文本插入活动单元格
- java - 区块链投票java程序的输入有循环问题
- linux - 为动态日期编写脚本以查找访问服务器的无效用户
- excel - intCounter,如何从 Excel 中的特定单元格开始?