我试图向某人解释为什么他们有一个悬空指针以及 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]);
}
根据对 C 标准的严格解读,你不能用悬空指针做任何事情:“不确定”,保存悬空指针的内存状态,也描述了未初始化的自动变量的内容,这些如果您连续读取两次,可能会有不同的值 https://godbolt.org/g/UyL4sZ(*).
解决这个问题的唯一方法是将指针转换为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标准区分自动变量未获取其地址(“可以使用寄存器存储类声明”) https://port70.net/~nsz/c/c11/n1570.html#6.3.2.1p2, but 铿锵不关心 https://godbolt.org/g/bdwCmu.
具体回答您的使用建议memcpy
, note that memcpy不确定的记忆产生不确定的记忆 https://godbolt.org/g/tWLTir.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)