【问题标题】:How did the output come out as '10'? [duplicate]输出是如何变成“10”的? [复制]
【发布时间】:2013-07-22 16:56:04
【问题描述】:

下面是代码。谁能解释一下它背后的逻辑。

#include<stdio.h>

int main() 
{
    int *i,*j;
    i=(int *)60;
    j=(int *)20;
    printf("%d",i-j);
    return 0;    
}

【问题讨论】:

  • i - j 是指针差异,系统中 int 的大小是 4 个字节,value-wsie 差异是 4010 * sizeof(int) ,10 个位置相距很远。
  • 你们为什么要支持这个?
  • 此外,如果6020 不是有效地址,程序将调用未定义的行为。
  • 你应该使用%td而不是%d%td是指针运算的格式说明符。
  • @H2CO3 当双关指针永远不会被取消引用时,它是否会调用未定义的行为?还是代码在某个时候更改了...?我想,也许确实如此,因为“不相关数组中的指针之间的指针算术是未定义的”情况,但我认为在这种特殊情况下,“未定义”仍然会做一些“合理”的事情......

标签: c pointers


【解决方案1】:

您正在分配指针值 60 和 20。

由于int*(指针),在您的平台上是每个4字节(32位),并且j和i之间有40字节的差异,i-j返回40 / sizeof(int),它打印10

【讨论】:

    【解决方案2】:

    这是因为指针算法。 当您向指针添加一些值时,结果将取决于指针的类型。在您的系统上,sizeof(int) 似乎等于 4 个字节,所以当您这样做时:

    int    *p = 0x1000; //totally dumb value, just for example
    printf("%p\n", p + 1);
    

    这将打印 0x1004。

    所以:(int*)60 - (int*)20 = 10,因为 10 * 4(您系统上 int 的大小)。

    【讨论】:

    • @ReedCopsey 不,这是不正确的。指针的基本类型很重要。
    【解决方案3】:

    T 类型的两个指针之间的距离几乎等于(a - b) / sizeof (T)。如果你说

    int* a = 0xdeadbeef;
    int* b = a + 1;
    

    那么 a 和 b 之间的数字距离将为 sizeof(int)(通常为 4)但不是 1。并且以防万一

    char* x = 0x12345678;
    char* y = x + 1;
    

    距离正好是 1。

    【讨论】:

    • void * 上的指针运算不是标准 C,这是不允许的。可能你的意思是char *
    • @H2CO3 是的,坏我,忘了它。抱歉,现在已修复。谢谢。
    【解决方案4】:

    i 和 j 是指向ints 的指针。在 4 字节机器上,ints 的长度为 4 字节,指针 2 与连续的ints 之间的差值为 4。60 - 20 / 4 是 - err - 10

    【讨论】:

    • 60 - 20 / 4 是 55。你的意思可能是 (60 - 20) / 4
    • 在 4 字节机器上,整数是 4 字节长 -> 在每个 32 位系统上并非如此。
    【解决方案5】:

    好吧,我想你已经得到了答案,但这是标题;你必须考虑的大小 变量,这意味着在这种情况下 sizeof(int)==4。所以 40 个字节等于 10 个 int(在您的操作系统中)。

    【讨论】:

      【解决方案6】:
      60-20 => 40 bytes.
      sizeof(int *) = 4 bytes.
      i => int *; j=int*
      

      所以,当你做 60-20 时,你在做 (int * - int *),即 60-20 中有多少个 int *?

      60-20 = 40 
      40/4 => 10.
      

      注意:假设 sizeof(int *) 是 4 个字节。

      【讨论】:

      • "即 60-20 中有多少个 int *?" - 不,它计算有多少ints。 “假设 sizeof(int *) 是 4 个字节。” - 这无关紧要,sizeof(int) 才是最重要的。
      • 我的意思是指针将进行多少次跳转,即它必须跳过多少个整数。但是,发表您的评论,我可以看到它是如何误导的。感谢您的指正。我喜欢你的精确定义。
      猜你喜欢
      • 2014-07-31
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      相关资源
      最近更新 更多