我正试图向某人解释为什么他们有一个悬空的指针以及自由实际上是如何工作的(并且指针是值,因此是按值传递的),但是为此,我认为我需要一种打印指针的方法并非“不确定”(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]);
}
答案 0 :(得分:8)
根据对C标准的严格阅读,使用悬挂指针不能做任何事情:“不确定”是持有悬挂指针的内存状态,还描述了未初始化的自动变量的内容,这些{ {3}}(*)。
解决该问题的唯一方法是将指针转换为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);
(*)C11标准区分自动变量may have different values if you read them twice in a row,但the address of which is not taken (“that could have been declared with the register storage class”)。
要具体回答您使用memcpy
的建议,请注意Clang does not care。