c - 有时在保存有条件分配的内存的指针上使用free时程序崩溃

标签 c dynamic-memory-allocation calloc

这是一个简单的代码,仅用于说明我正在处理的问题。

如果输入 n = 3 ,则将数组元素输入为1、2、3 m = 0 ,程序崩溃!!!

为什么会这样呢?发生问题是由于的最后2行涉及free()

现在我的问题是为什么这件事正在发生?如果删除了free语句,则具有相同输入的相同程序不会崩溃...

请给我解释一下。 是否是因为条件内存分配导致了上述问题的发生? 如果是,那为什么呢?

我没有得到任何提示,而且据我所知,free(NULL)不会导致任何错误,因此问题是当我尝试释放分配的内存之一时引起的,尤其是输入中的 positive ...

这是我的代码:

#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;
}

这是我的输出:

enter image description here

最佳答案

使用您提到的输入值,首先要做:

end=arr[n-1];
positive=(int*)calloc(end,sizeof(int));

给定n == 3arr[n-1] == 3,您为int分配了3个positive数组。

在下一个循环中,您最终将执行以下操作:
positive[arr[i]]=p;

尝试覆盖positive[3](当i == n-1时)。这试图写出数组的边界(有效索引范围从02),然后undefined behavior,这意味着在此之后一切都可能发生,包括崩溃。

关于c - 有时在保存有条件分配的内存的指针上使用free时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55275254/

相关文章:

c++ - 为大节点树动态分配内存

c++ - `y=++y`,这个标准符合吗? [出现在微软的测试中]

c++ - 如何为多态数据类型动态分配内存?

c - 为什么我会收到此错误以及如何修复它 : munmap_chunk(): invalid pointer: 0x0000000000400694 *** Hello WorldAborted

C++ 性能 : checking a block of memory for having specific values in specific cells

c - malloc 看起来不适用于我的程序

c - 使用 Assert 和 -B 进行 Makefile 帮助/说明

char 数组上的 C/C++ 开关大小写

c - C语言逐行读取文件

c - C中calloc的反义词是什么