出于演示目的,我如何打印悬空指针?

Son*_*Ex2 6 c language-lawyer dangling-pointer

我想,为什么他们有一个悬摆指针向别人解释和自由是如何工作(以及指针的值,因此是通过按值),但我认为我需要一种方法来打印指针与工作不" t"不确定"(如同printf("%p", ptr)).

memcpy会不会这样做?

char buf1[sizeof(char *)];
char buf2[sizeof(char *)];
char *malloced = malloc(10);
memcpy(buf1, &malloced, sizeof(char *));
free(malloced);
memcpy(buf2, &malloced, sizeof(char *));
for (int i=0; i<sizeof(char *); i++) {
    printf("%hhd %hhd / ", buf1[i], buf2[i]);
}
Run Code Online (Sandbox Code Playgroud)

Pas*_*uoq 8

据的C类标准严格的阅读,你不能做一个悬摆指针什么:"不确定",记忆保存一个悬摆指针的状态,还介绍了未初始化的自动变量的内容,而这些可能有不同的价值观如果你连续两次阅读它们(*).

解决此问题的唯一方法是将指针转换uintptr_t 为仍然有效的指针.转换的结果是一个整数,并具有整数的属性:

#include <stdint.h>
...
char *malloced = malloc(10);
uintptr_t ptr_copy = (uintptr_t) malloced;
...
free(malloced);
// it is valid to use ptr_copy here to display what the address was.
printf("The pointer was at: %" PRIxPTR "\n", ptr_copy);
Run Code Online (Sandbox Code Playgroud)

(*)C11标准区分了未采用地址的自动变量("可以用寄存器存储类声明的"),但Clang并不关心.

具体回答您的使用建议memcpy,要注意的是memcpy不确定的记忆产生不确定的记忆.