6

我试图向某人解释为什么他们有一个悬空指针以及 free 的实际工作方式(并且指针是值,因此是按值传递的),但为此我认为我需要一种打印指针的方法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]);
}
4

1 回答 1

9

根据严格阅读C标准,你不能用悬空指针做任何事情:“不确定”,持有悬空指针的内存状态,也描述了未初始化的自动变量的内容,这些可能有不同的值如果您连续阅读两次(*)。

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

#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 标准区分自动变量的地址没有被占用(“可以用寄存器存储类声明”),但Clang 不在乎

要具体回答您的使用建议memcpy请注意不确定内存会产生不确定内存memcpy

于 2018-07-14T23:30:07.783 回答