我已经创建了将内存地址打印到stdout的函数,但是它的功能与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);
答案 0 :(得分:1)
0x7fff58a2d2bb
用十六进制(或基数16)格式表示的140,734,680,453,819
,其中数字a
代表10,b
代表11,最多f
代表15。
对于内存地址,基数优先于基数10或十六进制,因为16是2的幂,因此便于查看作为位掩码,而10则不是,因此就位掩码而言很难查看。 / p>
答案 1 :(得分:1)
0x7fff是什么意思?
丢失的“ 0x7fff”是错误代码ft_itoa_base()
中丢失的正确十六进制地址的一部分。
给定one of the variables was int instead of uintmax_t,OP的原始ft_itoa_base()
尚未完全uintmax_t
准备就绪。
这导致输出打印截断的地址“ 58a2d2bb”,而不是正确的“ 7fff58a2d2bb”。
已发布的更正后的ft_itoa_base()
具有一些弱点。
// char* ft_itoa_base(uintmax_t num, uintmax_t base) {
// No need for base to be so wide with uintmax_t
char* ft_itoa_base(uintmax_t num, int /* or unsigned */ base) {
int i;
uintmax_t val_cp;
// uintmax_t rem;
// No need for rem to be so wide with uintmax_t
int /* or unsigned */ rem;
char *str;
...