【问题标题】:Why is the output reversed along with the first character missing? [duplicate]为什么输出与第一个字符丢失一起反转? [复制]
【发布时间】:2017-07-28 05:41:39
【问题描述】:
#include<stdio.h>
int main()
{
    char *a;   
    char *temp ='55515';
    a = &temp;  
    printf("%s ", a);
}

预期输出是 55515 但实际输出是 5155?

【问题讨论】:

  • '55515' 对于字符文字来说太长了,a = &amp;tempchar** 分配给 char*i 未使用,您为什么希望其中的任何部分起作用?
  • 你的编译器没有给你任何警告吗?
  • 使用temp = "555515"printf("%s", temp);...
  • 这仍然不能解释为什么输出被反转。
  • '555515' 与 "555515" 不同。 AND printf("%s", *a);与 printf("%s", a); 不同*a= temp 的值,但 a=temp 的地址。

标签: c pointers


【解决方案1】:

'55515' 是一个转换为int 的多字符常量。您的平台具有 32 位 ints,因此 MSB 字节被丢弃,结果 int(int)0x35353135。然后以实现定义的方式将其转换为指向char 的指针。您的平台是 little-endian 平台,char 转换保留 int 值。指针对象的 value 现在在内存中布局为

temp:   
| 0x35 | 0x31 | 0x35 | 0x35

| 0x35 | 0x31 | 0x35 | 0x35

无论您使用的是 64 位还是 32 位平台,都不能扣除。 现在你将 another 指针指向 char *,它指向 pointer 对象 的第一个字节,即字节 0x35,然后将 printf 作为一个字符串%s.

根据您的平台,printf 调用仅具有实现定义的行为,也可能具有未定义的行为 - 这取决于您的指针是 32 位还是 64 位宽 - 如果是 32 位,那么您有未定义的行为,如果是 64 位,您'只是取决于实现定义的行为。总而言之,这不是严格遵守程序所依赖的。

【讨论】:

  • 以上答案是正确的,但是注意严重的编译器会发出警告,或者两个:
  • 添加代码示例
猜你喜欢
  • 2022-12-22
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多