我们正在使用: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
答案 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。
指向地址中的数据在free
和printf
之间可能会也可能不会发生变化。此行为未定义,并且访问悬空指针是错误的。
此外,您没有分配足够的空间来存储您正在复制的字符串,这是错误的。您应该分配strlen("data structure") + 1
个字节。
此外,不要强制转换malloc
的返回值,p = malloc(....)
是使用较新编译器执行此操作的正确方法。