【问题标题】:What does 0x7fff mean? C language0x7fff 是什么意思? C语言
【发布时间】: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_tuintmax_t 确实有匹配的打印说明符,而 uintptr_t 没有。 OP 可能会将uintptr_t 转换为uintmax_t

标签: c memory printf ip-address


【解决方案1】:

0x7fff58a2d2bb140,734,680,453,819 以十六进制(或以 16 为基数)格式表示,其中数字 a 代表 10,b 代表 11,直到 f 代表 15。

对于内存地址,基数 16 或十六进制格式比基数 10 更可取,因为 16 是 2 的幂,这使得它便于作为位掩码查看,而 10 则不是,因此难以根据位掩码查看。

【讨论】:

    【解决方案2】:

    0x7fff 是什么意思?

    缺少的“0x7fff”是在错误代码ft_itoa_base() 中丢失的正确十六进制地址的一部分。

    OP 的原始ft_itoa_base() 没有完全准备好uintmax_t 给定one of the variables was int instead of 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;
    
      ...
    

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 2011-08-27
      • 2022-01-12
      • 2020-08-07
      • 2016-12-03
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多