-2

我有一个接受指向 int64 的指针并打印值的函数。现在,如果我从调用函数传递一个整数,它会给出原始值加上额外的 4 个字节,因为它是一个 int64 并且正在传递整数。我该如何处理这个问题,以便如果我将一个整数传递给接受 int64 的函数,仍然会打印一个整数值。

void foo(int64_t * temp) // just mentioning a simplified function
{
    printf("%llx\n",*temp); 
}

如果我尝试传递一个值为“0x12345678”的整数,那么 foo 函数打印出的值是“xxxxxxxx12345678”,其中 xxx 是垃圾值。

更新:我可以通过使用临时 int64 变量/指针并传递它来做到这一点,但我不这样做或者不能这样做,还有其他方法吗?

4

3 回答 3

1

简短的回答是否定的 - 您的函数需要一个指向 64 位值的指针,并且您必须提供这样的指针。

但是请注意,示例中根本没有理由传递指针 - 为什么不按值传递参数,从而接受最多 64 位的任何整数类型?

void foo(int64_t temp)
{
    printf("%llx\n",temp); 
}
于 2013-05-17T22:26:10.083 回答
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

于 2013-05-17T22:51:15.870 回答
1

如果你输入一些东西来伪造编译器,那么所有的赌注都没有了。未定义的行为和所有的爵士乐。要修复它,请创建一个适当的变量并使用它调用您的函数:

int32_t x = 0x12345678;
int64_t y = x;

foo(&y);

编辑:您说您“不要或不能”进行此更改,但如果您希望它起作用,则必须这样做。

于 2013-05-17T22:21:19.830 回答