C中的内存分配程序无法正常工作(Malloc,免费)

时间:2014-08-12 06:22:44

标签: c malloc free

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

我们对以下代码段有疑问:

#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的地址也正确显示。

请告诉解决方案&amp;这个问题背后的原因。 谢谢 KB

3 个答案:

答案 0 :(得分:2)

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

为避免悬空指针,请在null -

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

答案 1 :(得分: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 */

答案 2 :(得分:1)

free不会改变指针中的值,因此free之前和之后的地址将始终相同。如果这是你想要的,你需要明确地将它设置为NULL。

指向地址中的数据在freeprintf之间可能会也可能不会发生变化。此行为未定义,并且访问悬空指针是错误的。

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

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