鶺鴒雲中君 2022-10-20 16:13 采纳率: 50%
浏览 40
已结题

C语言 十进制形式输出数组的地址出现警告提示信息

大家好,我目前自学了三个月的C语言入门,想问一个比较基础的问题,我已经尝试搜索是否有同样出现过的问题,但并没有找到我能理解的答案。我在学习C语言的字符数组时,想以十进制形式输出数组的首地址,我定义了一个 long 型变量来存储这个地址,但是在运行后得到的是如下的提示信息,我看不懂这个是什么意思,想请问有没有人能解答一下?谢谢!我使用的是 windows 64 系统下的 visual studio code 2022 来运行这段代码的,前面的代码我都已经理解了,但是唯独最后的两个输出指令反馈回来的信息我还不能理解。

#include <stdio.h>
int main(){
    char str[30] = "I love_Stella, Always";
    char *s1 = str;             //字符串指针,指向 str[0],可以直接输出整个字符串
    printf("\n  s1 = %s\n", s1);
    char *s2 = str+2;           //字符串指针,指向 str[2],只能输出从第2个元素开始的整个字符串
    printf("  s2 = %s\n", s1);
    char c1 = str[4];           //取单个字符,str[4] = 'v'
    printf("  c1 = %c\n", c1);
    char c2 = *str;             //取单个字符,*str = str[0] = 'I'
    printf("  c2 = %c\n", c2);
    char c3 = *(str+4);         //取单个字符,*(str+4) = str[4] = 'v'
    printf("  c3 = %c\n", c3);
    char c4 = *str+2;           //取单个字符后,对照ASCII的值+2'I'+2 = 'k'
    printf("  c4 = %c\n", c4);
    char c5 = (str+1)[5];       //取单个字符,(str+1)[5] = str[6] = '_'
    printf("  c5 = %c\n", c5);
    int num1 = *str+2;          //取单个字符后,对照ASCII的值+2'I'=7373+2 = 75
    printf("num1 = %d\n", num1);
    printf(" str = %#X\n", str);//以十六进制形式,输出str[0]的地址
    long num2 = (long)str;      //以十进制形式,输出str[0]的地址
    printf("num2 = %ld\n", num2);
    long num3 = (long)(str+2);  //以十进制形式,输出str[2]的地址
    printf("num3 = %ld\n", num3);
    return 0;
}
PS C:\Users\Frede> cd "c:\Users\Frede\Desktop\" ; if ($?) { gcc Draft.c -o Draft } ; if ($?) { .\Draft }
Draft.c: In function 'main':
Draft.c:21:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   21 |     long num2 = (long)str;      //浠ュtr[0]?                 ^
Draft.c:23:17: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   23 |     long num3 = (long)(str+2);  //浠ュtr[2]?                 ^

  s1 = I love_Stella, Always
  s2 = I love_Stella, Always
  c1 = v
  c2 = I
  c3 = v
  c4 = K
  c5 = _
num1 = 75
 str = 0XF29FFA70
num2 = -224396688
num3 = -224396686
PS C:\Users\Frede\Desktop>

以上就是运行代码后得到的结果。
我已经确认过最后两行以十进制形式输出的地址和十六进制形式输出的地址相同,只是不清楚 “warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]” 这一行信息是在告诉我什么。

  • 写回答

3条回答 默认 最新

  • 关注

    这个警告的意思是:从指针往int类型转换,转换过程中值会发生截断。也就是两个值的数据范围不一样导致的。
    在64位系统中,地址一般是uint_64类型的,也就是unsigned long long ,所以,你的代码最后4行需要改成下面的:

    unsigned long long num2 = (unsigned long long)(str);      //以十进制形式,输出str[0]的地址
    printf("num2 = %lld\n", num2);
    unsigned long long num3 = (unsigned long long )(str + 2);  //以十进制形式,输出str[2]的地址
    printf("num3 = %lld\n", num3);
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 TMC2209串口模式下读取不到寄存器的值串口助手蓝色字体是发过去的消息,绿色字体是收到的消息,第二行发送读取寄存器的指令但是没有读取到寄存器的值串口助手如下图:接线如下图,如何解决?
  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题