将int变量的值赋给int指针

时间:2017-11-22 18:39:25

标签: c pointers casting int assign

我在嵌入式软件项目中使用了以下C函数。它还用于验证硬件而非生产中。

void reg_read(int addr) {
   int result;
   int* reg_addr = (int*)(addr); // I cast the value of the addr variable to the reg_addr pointer hoping that it would point to the address stored in addr
   result = (*reg_addr); // this should trigger a read transaction on the AXI interface of the ARM CPU that I'm simulating
}
// later on...in the main function
reg_read(0x08000704);

嵌入式软件在模拟环境中运行(使用QEMU + SystemC),我可以看到AXI读取事务是否发生。在这种情况下,它不会发生。

但是,如果我为指针int* reg_addr = (int*)0x08000704;分配一个常量值,那么就会发生AXI事务。

我假设编译器在每种情况下都会生成不同的指令。我还尝试将reg_addr声明为volatile int* reg_addr;,但它也没有用。

是否有一种可移植且兼容的方式将int变量的值转换为int指针?

1 个答案:

答案 0 :(得分:0)

您的问题是:

  

是否存在一种可移植且兼容的方法来转换int的值   变量为int指针?

没有。总结一下:

  

将整数转换为指针是由实现定义的-Antti Haapala

有人建议您使用uintptr_t或类似的字体,这是Eugene Sh的很好建议。

以uintptr_t为例

SELECT t1.A, t2.B, COALESCE(t3.C, 'c0') AS C
FROM (SELECT DISTINCT A
      FROM Table1) t1
CROSS JOIN Table2 t2
LEFT JOIN Table1 t3 ON t3.A = t1.A AND t3.B = t2.B

从Microsoft Visual C ++头文件vadefs.h的vadefs.h文件中定义为:

a   b   c
a1  b1  c1
a1  b2  c2
a1  b3  c0
a1  b4  c0
a2  b1  c3
a2  b3  c0
a2  b2  c0
a2  b4  c0

以这种方式,如果为x86编译,它将解析为32位数据类型,而对于x64,则解析为64位数据类型。