如何将变量的地址表示为字符串?
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
不是一个选项,因此您必须实现自己的十进制到十六进制字符串转换器的变体。将任何地址转换为宽无符号整数类型并将该数字转换为十六进制。
我必须在 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
不是一个选项,因此您必须实现自己的十进制到十六进制字符串转换器的变体。将任何地址转换为宽无符号整数类型并将该数字转换为十六进制。