/@@* filename abc.c */
#include <stdio.h>
#include <stdint.h>
int main(void){
uint64_t bb = 0; // 这里声明并初始化了一个uint32_t的变量bb,初始化赋值了0
uint16_t aa[10]; // 这里声明了uint16_t数组aa,有10个元素,没有初始化
int16_t *cc; // 这里另外声明了指向uint16_t指针的指针变量 cc,加 * 表示指针变量
bb = &aa[0]; // 把 aa 的地址 赋值给bb,注意 &aa[0] == aa,在32bit系统中,地址值是32bit无符号整数
cc=(int16_t *)bb; // 把bb的值,也就是aa的地址赋值给cc,并强制为int16_t类型指针
*cc= 1234 ; // 把cc指向位置的值设置为1234
printf("cc is %p\n"cc);
printf("bb is %lx\n"bb);
printf("a0 is %p\n"&aa[0]);
printf("a0 has v %d\n"aa[0]);
printf("cc has v %d\n"*cc);
return 0;
}
因为我是在一个64位的Linux上测试的代码,所以上述内容估计在64位机器上能够成功,如果要改变为是32位系统,需要把
uint64_t bb = 0; // 这里声明并初始化了一个uint32_t的变量bb,初始化赋值了0
改为
uint32_t bb = 0; // 这里声明并初始化了一个uint32_t的变量bb,初始化赋值了0,其它的不用变
或者在编译时配置环境,设置相应编译选项(-m32),再编译,实现在64位系统中编译输出32位结果。
上面的代码用gcc abc.c 输出abc.o 是可以运行的,在机器上的运行输出为:
cc is 0x7ffc4e629500
bb is 7ffc4e629500
a0 is 0x7ffc4e629500
a0 has v 1234
cc has v 1234
程序是正常的,唯一有一个警告,是关于 bb = &aa[0]; 的,这很正常,因为把地址指针值赋值给普通变量啦。
我想你可能出错有可能就是编译系统和设置不匹配。比如你在64位系统中,希望编译一个32bit的应用。