【问题标题】:Memory Allocation program in C not working properly (Malloc, free) [duplicate]C中的内存分配程序无法正常工作(Malloc,免费)[重复]
【发布时间】:2014-08-12 06:22:44
【问题描述】:

我们正在使用:Windows XP 上的 Turbo C3 编译器。

我们对以下代码sn-p有一个问题:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
  void main()
 {
  char *ptr;
  ptr=(char*)malloc(10*sizeof(char));
  strcpy(ptr,"data structure");
  printf("\n *ptr=%s \n add=%u",ptr,ptr);
  free(ptr);
  printf("\n *ptr=%s \n add=%u",ptr,ptr);
  getch();
 }

在上面的程序中,即使在释放 ptr 之后,ptr 的值和 ptr 的地址也是正确显示的。

请说出这个问题背后的解决方案和原因。 谢谢 知识库

【问题讨论】:

  • 请不要在 C 中转换 malloc 的返回值
  • 你真的在使用 22 岁的编译器吗?如果你这样做了,那可能是升级的好时机;有很多免费的选择。
  • 不,不要升级! MS DOS 是未来!

标签: c malloc free


【解决方案1】:

释放内存后,指针仍然指向相同的内存位置。它被称为Dangling Pointer。

为避免指针悬空,在free之后创建指向null的指针-

free(ptr);
ptr = NULL; // Fix
printf("\n *ptr=%s \n add=%u",ptr,ptr);

【讨论】:

  • 我认为带有 NULL 指针的 printf 也不是一个好主意
【解决方案2】:

free() 不会将指针重置回NULL。您有责任确保在它被释放后不会取消引用它。

如果你这样做,那就是undefined behaviour。

我可以在您的程序中看到两种未定义行为的情况:

1 - 这里你正在写过去分配的内存:

 strcpy(ptr,"data structure"); /* UNDEFINED BEHAVIOUR */

2 - 在 ptr 被释放后,您在此处取消引用:

free(ptr);
printf("\n *ptr=%s \n add=%u",ptr,ptr); /* UNDEFINED BEHAVIOUR */

【讨论】:

    【解决方案3】:

    free 不会更改指针中的值,因此free 之前和之后的地址将始终相同。如果这是您想要的,您需要将其显式设置为 NULL。

    指向地址中的数据可能会或可能不会在free 和printf 之间变化。此行为未定义,访问 悬空指针 是错误的。

    另外,您没有分配足够的空间来存储您正在复制的字符串,这是错误的。您应该分配strlen("data structure") + 1 字节。

    另外,不要强制转换 malloc 的返回值,p = malloc(....) 是使用较新的编译器的正确方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-05
      • 1970-01-01
      • 2020-11-01
      • 2014-12-01
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多