【问题标题】:free() can't free the dynamically allocated memory in my c codefree() 无法在我的 c 代码中释放动态分配的内存
【发布时间】:2015-10-15 22:42:55
【问题描述】:

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

【问题讨论】:

  • 这不清楚。您的问题有什么症状?
  • @Beman “我无法释放内存”不够具体。无论如何,free 被注释掉了,所以它不可能释放任何东西。
  • @Beman:没有“解决方案”。调用free 后读取或写入内存是错误的。不要那样做,你的代码坏了。
  • 你会写出 1000 次“我释放内存后不能访问内存,因为这样做是未定义的行为”。

标签: c algorithm matrix


【解决方案1】:
  free(ar);  

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

  free(ar);
  ar=NULL;

这样,如果您尝试访问它,您的程序将会崩溃,以便您知道发生了错误。

【讨论】:

  • 我想说 free(ar) 没有释放内存。如果你看到编辑过的问题,我在释放后打印了第一行,这给了我以前的矩阵条目,如果我打印其他以相同的方式行也有相同的结果。因此 free(ar-(n*n)) 语句不会清理内存。
  • @Beman 您看到前两个值不是 n ar 。这些值可以是任何值。请注意您的输出。您正在调用未定义的行为,因此它可以打印任何内容。
猜你喜欢
  • 1970-01-01
  • 2013-11-22
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2018-03-26
  • 2013-01-27
相关资源
最近更新 更多