【问题标题】:problems using free for a struct of dynamic arrays对动态数组结构使用免费的问题
【发布时间】:2018-08-29 15:06:33
【问题描述】:

我无法理解为什么在用 C 语言处理以下代码时它会给我一个 Seg-Fault:

这里是类型和声明:

typedef struct Tcell { char* left;
             char* right;
            struct Tcell* next;} Tcell;


Tcell* T;

T=malloc(sizeof(Tcell));
T->right=malloc(sizeof(string2) + sizeof(char)*10); //string2 is a dynamic string of chars.
T->left=malloc(sizeof(char)*11);
strcpy(L->right, string2); 
L->left="_";
free(T->left);
free(T->right);
free(T);

aaaa 并且我在第一个(第二个免费)时遇到了 Seg-Fault

似乎在任何地方都找不到答案:S

【问题讨论】:

  • 问题可能出在您“在程序中使用它们”的部分,而您没有向我们展示。所以请尝试创建一个Minimal, Complete, and Verifiable Example 向我们展示。
  • 你能证明所有三个指针在释放时都是非空的并且没有改变,例如to left=left+1... 最重要的是还没有被释放?
  • 请不要讲故事,而是提供 MCVE 和How to Ask 指定的所有信息。
  • sizeof(char) 总是等于 1,所以你可以跳过它。您不检查 malloc 是否失败(但这不是问题, free(NULL) 可以这样做)。因此,您向我们展示的代码应该“工作”。您的错误位于您没有向我们展示的代码上。请提供一个 MVCE。
  • @Tom's: T->… 将调用 UB。但是 OP 似乎对提供所有必需的信息和 MCVE 不感兴趣,所以我们应该顺其自然。

标签: c pointers segmentation-fault malloc free


【解决方案1】:

正如@Yunnosch 在评论部分提到的,在释放动态内存之前,您可能已经修改了指针。

例如下面的代码给出了分段错误

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

typedef struct Tcell {
    char* left;
    char* right;
    struct Tcell* next;
} Tcell;


int main(){
    Tcell *T;
    T=malloc(sizeof(Tcell));
    assert(T != NULL);
    T->right=malloc(sizeof(char)*10);
    assert(T->right != NULL);
    T->left=malloc(sizeof(char)*11);
    assert(T->left != NULL);

    printf("check\n");
    T = T-> next;

    free(T->left);
    free(T->right);
    free(T);
    return 0;
}

当你删除线时

T = T-> next;

一切顺利。

所以像这样你可能已经在你的代码中修改了你的 T。

【讨论】:

  • 很抱歉没有提供代码。我编辑以显示我遇到问题的地方
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2022-11-17
  • 2014-01-16
相关资源
最近更新 更多