【发布时间】:2020-10-30 05:02:12
【问题描述】:
我已经创建了将内存地址打印到标准输出的函数,但它的工作方式与 printf("%p", ...) 相同。例如 printf 给了我这个:0x7fff58a2d2bb 但我的函数打印出这样的东西:58a2d2bb。我知道 0x 是什么意思,但不知道 7fff 是什么意思。有人能解释一下这部分是什么意思吗?如何将它添加到我的代码中:
char *ft_itoa_base(uintmax_t num, uintmax_t base){
int i;
uintmax_t val_cp;
uintmax_t rem;
char *str;
val_cp = num;
i = 1;
while((val_cp /= base) >= 1)
i++;
str = ft_strnew(i); // Basically what it does (char*)malloc(sizeof(char) * (i + 1))
str[i] = '\0';
while(i-- > 0)
{
rem = num % base;
str[i] = (rem > 9)? (rem-10) + 'a' : rem + '0';
num /= base;
}
return (str);}
char a = 'x';
void* p0 = &a;
uintmax_t i = (uintmax_t)p0;
ft_putstr(ft_itoa_base(i, 16));
ft_putchar('\n');
printf("PrintF: %p", p0);
【问题讨论】:
-
您的代码使用的类型似乎太短而无法在您的环境中存储地址,请发Minimal, Reproducible Example。
-
十六进制(以 16 为底)。
-
你应该使用
uintptr_t来处理整数地址。 -
函数
ft_itoa_base()无法处理uintmax_t。贴出它的代码。 -
@MikeCAT 自 C99 以来,由于
uintptr_t是可选类型,但uintmax_t是必需的,您认为在什么情况下uintptr_t会将对象地址处理为uintmax_t的整数会失败吗?当然uintmax_t的范围满足/超过uintptr_t。uintmax_t确实有匹配的打印说明符,而uintptr_t没有。 OP 可能会将uintptr_t转换为uintmax_t。
标签: c memory printf ip-address