c - 为什么我的双指针会覆盖其行?

标签 c pointers malloc free

我试图一次向每行的每个 block 输入一个字符,但发生的情况是最新行将覆盖我存储在前一行中的先前内容。最后,我的所有行都有相同的内容。有人可以解释我做错了什么吗?

#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>

int main()
{
    int row=0,col=0,i;
    char c;
    char **this=NULL;

    this=calloc(64,sizeof(char*));


    for(i=0;i<64;++i)
    {
        this[i]=calloc(5,sizeof(char));
        free(this[i]);
    }

    while(c!=EOF)
    {
        c=getchar();
        if(!isspace(c)&&isprint(c))
        {
            if(c==',')
            {
                this[row][col]='\0';
                row++;
                col=0;
            }
            else if(c=='.')
            {
                this[row][col]=c;
                this[row][col+1]='\0';
            }
            else 
            {
            this[row][col]=c;
            //printf("%d,%d\n",row, col);
            //printf("%c\n",this[row][col]);
            //printf("%s\n",this[row]);
            //printf("%s\n",this[row+1]);
            col++;
            }
        }
    }
    printf("string0:%s\n",this[0]);//prints the same thing
    printf("string1:%s\n",this[1]);

    free(this);
    return 0; 
}

最佳答案

在您的代码中,在calloc()之后,您立即执行

 free(this[i]);

将内存标记为已释放(即不再使用)。然后,稍后您尝试使用该内存,它会导致 undefined behavior .

使用完内存后,您必须释放它。对单个 this[i] 调用 free() 的好时机就在

之前
  free(this);

打电话。

关于c - 为什么我的双指针会覆盖其行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43607208/

相关文章:

c - 检测日志文件已在 POSIX 系统上被删除或截断?

c - Opengl-如何使用事件键盘围绕轴自身旋转四面体?

c - 为什么以下 C 代码在 Turbo C 中有效,而在 Devc++ 中无效?

c - 获取C双向链表中的最后一个元素错误

c - 外部函数中的 Malloc()ing 导致内存泄漏

c++ - MongoDB C Driver Windows 无法解析的外部符号

c - 在C程序中请求管理员权限?

c++ - 子类指针如何严格等于父类指针?

c - 我们应该检查内存分配是否失败吗?

c - 使用 free() 函数