如何将变量的地址表示为字符串?

How to represent address of a variable as a String?

我必须在 C 中重现 printf 函数。 我在打印地址 (%p) 时遇到问题。 所以我有一个变量地址,我需要 return 它作为一个 char 数组。 有可能吗?

char *ptrToString(void * x)
{   
    char *t = (char *)x;
    printf("Here: %s\n",t);
    return "abc";
}

char *getPtr(unsigned long long x)
{
    return ptrToString(&x);
}

指针是数字类型,因此在类似于 printf 的函数中使用 %p(首选)、%x%d 来打印它们。

您的 ptrToString 可能看起来像这样:


#include <stdio.h>
#include <stdlib.h>

const char *x = "test";

char *ptrToString(void *x) {
    char *s = malloc(sizeof(void*) * sizeof(char));
    sprintf(s, "%p", x);
    return s;
}

int main() {
    char *a = ptrToString( (void*) x);

    if (!a)
        return 1;

    printf("%s\n", a);
    free(a);
    return 0;
}

先小记:

char *getPtr(unsigned long long x)
{
    return ptrToString(&x);
}

int main() 
{
   long long someLong = 1;
   char *ptr = getPtr(someLong);
   return 0;
}

这里 ptrToString 将 return 变量 x 在堆栈上的地址而不是变量 someLong 的地址,因为变量的值将作为一个完全独立的实体复制到堆栈上。

至于答案本身,地址实际上只是一个表示内存中字节偏移量的数字。要将此数字转换为字符串,您需要一个变体整数到 ascii-like 函数,您可以在其中转换为基数 16 而不是基数 10。

我假设 sprintf 不是一个选项,因此您必须实现自己的十进制到十六进制字符串转换器的变体。将任何地址转换为宽无符号整数类型并将该数字转换为十六进制。