free()无法在我的c代码中释放动态分配的内存

时间:2015-07-25 08:14:37

标签: c algorithm matrix

我是c编程的新手。我需要一个(10^5)*(10^5)矩阵,我在其中定义一个圆形边界。边界内的矩阵条目将为1且在0之外。为了检查我已经开始使用(1000*1000)如果我不使用free(ar)语句,它会打印整个矩阵。当我使用(11*11)矩阵并相应地更改圆形边界并通过打印检查free(ar)'s操作时第一行显示以前的条目。我使用的是Windows 64位机器,代码:: blocks 13.12 IDE.This是我的代码(11 * 11)矩阵:

    #include <stdio.h>
    #include <stdlib.h>
    #include<math.h>
    #include<conio.h>
    #include<time.h>
    #define NULL ((void *)0)
    main()
    {
        int i,j,n,k,*ar;
        float p;

        printf("Enter n::::");
        scanf("%d",&n);

        ar=(int*)calloc((n*n),sizeof(int));

        if(ar==NULL)
        {
            printf("Memory allocation error");
            exit(1);
        }

        printf("\nThe matrix is::\n");

        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                p=((i-5)*(i-5)+(j-5)*(j-5));
                if(p<16)
                {
                    ar[i*n+j]=0;
                    printf("%d",ar[i*n+j]);
                }
                else
                {
                    ar[i*n+j]=1;
                    printf("%d",ar[i*n+j]);
                }
            }
            printf("\n");
        }

        printf("\nPRINTING COMPLETE\n");            

        free(ar-(n*n));

        printf("\nThe first row of the matrix is\n\n");

        for(k=0;k<11;k++)
        {
            printf("%d\t",*(ar+k));
        }
    }

输出结果为:

      Enter n::::11

      The matrix is::
      11111111111
      11111111111
      11100000111
      11000000011
      11000000011
      11000000011
      11000000011
      11000000011
      11100000111
      11111111111
      11111111111

      PRINTING COMPLETE

      The first row of the matrix is

        1         1       1       1       1       1       1       1                                          

        1         1       1

1 个答案:

答案 0 :(得分:1)

  free(ar);  

因此ar之后访问free会导致未定义的行为。因此,如果您在释放后不想访问它,请将其分配给NULL(只是一个好习惯)

  free(ar);
  ar=NULL;

因此,如果您尝试访问它,您的程序将崩溃,因此您知道发生了错误。