【问题标题】:free() not working correctly with structfree() 无法与 struct 一起正常工作
【发布时间】:2014-11-03 14:52:54
【问题描述】:

调用 free() 后,为我的结构分配的内存应该是 free 的。那么为什么我的代码仍在打印 l->val ?为什么尝试打印l->key时会失败?

#include <stdio.h>

typedef struct Node {
     char *key;
     char *val;
} Node;

int main(void) {
    Node *l=malloc(sizeof(Node));
    l->key="foo";
    l->val="bar";
    free(l);
    printf("%s\n", l->val);
    //printf("%s\n", l->key); /* this gives an error */
    return 0;
}    

【问题讨论】:

  • 那么,当您已经释放了 l 时,您希望 l-&gt;val 做什么?它已被销毁。在您尝试使用它时,没有 ll-&gt;val 这样的东西。
  • C 不在乎你引用的是什么地址。摆脱例外的语言。
  • 我的问题是为什么代码在被销毁后仍然打印l-&gt;val
  • 为什么printf("%s\n", l-&gt;val); 仍然有效?纯属运气,记忆位置依旧完好。为什么printf("%s\n", l-&gt;key); 会失败?运气不好,内存位置已经被覆盖了。 C在这种情况下就是这样。
  • 它有效是因为你很幸运,但它仍然是 UB。

标签: c struct free


【解决方案1】:

释放指针后将指针设置为 NULL 始终是一个好习惯。 由于您正在访问的内存仍然完好无损,您可以看到 l->val 的正确值。

Node *l=malloc(sizeof(Node));
l->key="foo";
l->val="bar";
free(l);
l = NULL;

【讨论】:

    【解决方案2】:

    free(l); 的执行释放了l 指向的内存,即它可以再次用于另一个malloc() 或另一个内存使用。此后,在内存分配和更改之前,它一般保持相同的内容。所以阅读l 会给出l 在被释放之前的最后一个内容。

    【讨论】:

    • 你没有l-&gt;varl-&gt;key分配内存。例如,您可以让它们指向静态对象,就像他在代码中所做的那样。
    • @FilipeGonçalves :我认为必须通过声明来初始化字符串 litteralk。否则不合法……
    • @HichamfromCppDependTeam 从字符串文字初始化字符数组必须在声明时完成。在这种特殊情况下,代码char wurzle[] = "Wimbledon" 被定义为等同于char wurzle[] = {'W', 'i', 'm', 'b', 'l', 'e', 'd', 'o', 'n', '\0'}。但是,您始终可以将字符串文字分配给指向字符的指针。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2020-08-19
    • 2013-02-06
    • 2019-02-02
    • 2021-10-15
    • 2016-07-05
    • 2016-09-13
    相关资源
    最近更新 更多