我有一个函数接受指向int64的指针并打印该值。现在,如果我从调用函数传递一个整数,它给出原始值加上额外的4个字节,因为它是一个int64并且正在传递整数。我如何处理这个问题,这样如果我将一个整数传递给接受int64的函数,仍然会打印一个整数值。
void foo(int64_t * temp) // just mentioning a simplified function
{
printf("%llx\n",*temp);
}
如果我尝试传递一个值为“0x12345678”的整数,那么foo函数输出的值是“xxxxxxxx12345678”,其中xxx是垃圾值。
更新: 我可以通过使用temp int64变量/指针并传递它来做到这一点,但我不能或者说不能这样做,还有其他方法吗?
答案 0 :(得分:1)
如果你想要伪造编译器,那么所有的赌注都会被取消。未定义的行为和所有爵士乐。要修复它,请创建一个合适的变量并用它来调用你的函数:
int32_t x = 0x12345678;
int64_t y = x;
foo(&y);
编辑:你说你“不愿意或不愿意”做出这样的改变,但如果你想让它发挥作用你就必须这样做。
答案 1 :(得分:1)
简短的回答是否定的 - 你的函数需要一个指向64位值的指针以及你必须给它的指针。
但是,请注意,示例中没有理由传递指针 - 为什么不通过值传递参数,从而接受最多64位的任何整数类型?
void foo(int64_t temp)
{
printf("%llx\n",temp);
}
答案 2 :(得分:1)
如果你必须在很多地方做这件事,你可以创建一个包装函数来为你完成上述工作,例如
void foo_i64(int64_t * temp) // your original function
{
// do stuff with that pointer
}
void foo_i(int * temp) // wrapper function
{
int64_t t2 = *temp; // copy value
foo_i64(&t2);
*temp = t2; // copy value back to where we need it. There might be an overflow!
}
现在,只要有foo_i()
变量进行修改/处理,就可以使用该包装函数int
。