我正在尝试打印一个地址指向的值,但问题是我需要根据传递给我的大小来取消此指针。因此,这种事情:

void print(Address addr, Int size) {
...
}

我对如何实现这一目标有些困惑。有人可以将我指向正确的方向吗?

编辑:好的,我在想:

char p[80];
memset(p, '\0', 80);
memcpy(p, addr, size);

然后退出为 *p。如果有更好的方法或正确的方法,请让我知道

有帮助吗?

解决方案

您的问题不清楚。如果您是说要从传递的地址转移任意二进制数据,则需要类似的内容:

void print(const unsigned char *addr, size_t size)
{
    while (size--) printf("%.2x", *addr++);
}

或者,如果您想打印未终止终止的字符数据,请尝试:

void print(const char *addr, int size)
{
    printf("%.*s", size, addr);
}

其他提示

如果是一个数字,我认为是这样,您将需要类似的东西:

int n=0;
if (size>sizeof(int)) { return; //int is too small };
for (int i=0;i<size;i++) {
  ((char*)(&n))[sizeof(int)-(i+1)] = ((char*)addr)[size-(i+1)];
}
printf("%d",n);

您可以在例程中使用开关语句:

switch (size) {
   case 1: print( *(char*)pointer); break;
   case 2: print( *(short*)pointer); break;
   case 4: print( *(long *)pointer); break;
   case 8: print( *(__int64*)pointer); break;
   default: puts( "unsupported);
}

(“打印”是打印各种大小的整数的例程,也许使用C ++多态性)

复杂的解决方案是使用C ++模板,例如使用参数类型 Integer 在调用时由实际变量类型沉降。然后,此例程可以按照此大小采取行动 Integer 变量(如果您自己实施更长的整数,则可能从1到8不等)。这种方法的这种缺点是编译器为每种类型的参数生成例程实例,而逻辑取决于大小,将导致某些测试的“始终为真”条件。一个简单的方法是始终使用您期望的最长类型的整数类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top