在一个任务中,我需要将十六进制的指针地址打印到标准输出中.问题是我只允许包括unistd.h,所以不允许printf.

我试着把它塑造成一个角色*但演员阵容完全不可能实现.所以在这里帮忙会很受欢迎的.

它应该打印出这样的内容:

000000010a161f40

推荐答案

我编写了一个print_pointer函数,它的作用与printf("%p",pointer)完全相同

#include <unistd.h>

void print_pointer(const void *p)
{
    static const char *table = "0123456789abcdef";
   unsigned long long value = (unsigned long long)p;
   // 1 digit = 4 bits
   char buffer[sizeof(void*)*2];
   int i,idx = 0;
   
   while(value)
   {
       int digit = value % 16;
       buffer[idx++] = table[digit];
       
       value /= 16;
   }
   // zero-padding
   for (i=idx;i<sizeof(buffer);i++)
   {
       buffer[i] = '0';
   }
   // reversed print, as division computes lowest digits first
   for (i=sizeof(buffer)-1;i>=0;i--)
   {
       write(1,buffer+i,1); // write 1 char to standard output
   }
   
    
}

int main()
{
    const char *data = "foo";
    
    print_pointer(data);
    
    return 0;
}

C++相关问答推荐

C限制限定符是否可以通过指针传递?

以c格式打印时间戳

返回一个包含数组的 struct

Malloc(sizeof(char[Length]))是否不正确?

自定义应用程序上的日志(log)轮换问题

进程在写入管道时挂起

I2C外设在单次交易后出现故障

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

添加函数会 destruct 嵌入式C代码(无IDE)

C11/C17标准允许编译器清除复合文字内存吗?

Wcstok导致分段故障

使用Open62541向OPCUA服务器发送读请求时内存泄漏

如何将大写/小写土耳其字母相互转换?

为什么我的二叉树删除删除整个左部分的树?

如何解释数组中的*(ptr)和*(ptr+2)?

在我的函数中实现va_arg的问题

程序打印一些随机空行

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

在 C 中的 scanf() 格式说明符中使用宏获取字符串长度

当 a 是代码块时使用逗号运算符 (a, b)