• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

C语言,一个32位整数表示地址,向这个地址写数据的方法

莱克迷KW 2021-11-24 浏览量:1393

有一个uint32_t的数,表示的是一个地址,把它转换成一个指针


 uint32_t bb = 0;//整数

int16_t aa[10]={0};//数组,用于产生一个可用的地址,实际这个地址是动态申请的。

int16_t *cc=NULL;//空指针,由于数据是16位的,所以用16位类型的指针。

bb = &aa[0];//bb的值是aa的地址,也就是一个32位数值,表示地址

从这个bb的地址开始,在这个地址开始的地方开始写入数据,

用cc指针,要怎么操作呢。

也就是,通过cc指针,把aa数据赋值的方式?

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • /@@* 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的应用。​

    • 发布于 2021-11-25
    • 举报
    • 评论 1
    • 0
    • 0
莱克迷KW 回复了 xdsnet:我运行时,会有内存出错的问题,不知道哪里的区别 回复

其他答案 数量:2
  • 假如地址是addr,要写入的数据是dat


    *((volatile uint32_t *) (addr)) = dat;

    • 发布于2021-11-26
    • 举报
    • 评论 1
    • 0
    • 0
莱克迷KW 回复了 aple0807 :用volatile 转换这个是什么原因 回复

莱克迷KW 回复了 一笔之名也 :那运行出错,是什么原因 回复

相关问题

问题达人换一批

C语言,一个32位整数表示地址,向这个地址写数据的方法