这个程序的输出是如何产生的?

时间:2011-12-14 07:34:36

标签: c

我有一段用C编写的代码,其中执行了一些指针算法。我想知道输出是怎么来的?

#include <stdio.h>  
int main()
{
    char arr[] = "gookmforgookm";
    char *ptr1 = arr;
    char *ptr2 = ptr1 + 3;
    printf ("ptr2 - ptr1 = %d\n", ptr2 - ptr1);
    printf ("(int*)ptr2 - (int*) ptr1 = %d",  (int*)ptr2 - (int*)ptr1);
    getchar();
    return 0;
}

输出如下:

ptr2 - ptr1 = 3  
(int*)ptr2 - (int*) ptr1 = 0

5 个答案:

答案 0 :(得分:6)

严格来说,您正在调用未定义的行为,并且根据C标准,程序生成的任何结果都是正常的。

但是,你可能在sizeof(int) == 4(而不是2)的机器上。由于整数有4个字节,因此相隔3个字节的两个地址是同一整数的一部分,因此地址之间的差异为0 * sizeof(int)。如果您选择ptr1 = arr + 1;,或者可能不是,则可能会找到不同的答案。但这就是未定义行为的美妙 - 无论如何都是'正确的'。

答案 1 :(得分:4)

减法后,您需要将结果除以指向类型的大小。

(int*)ptr2 - (int*)ptr1 == (0x1000003 - 0x1000000) / sizeof(int)
(int*)ptr2 - (int*)ptr1 == (0x1000003 - 0x1000000) / 4 == 0

答案 2 :(得分:1)

ptr1ptr2都是char *类型,这意味着一个字节一个指针。

char *ptr2 = ptr1 + 3;

所以

ptr2 - ptr1 = 3

接下来,您将两个指针都转换为类型int *int类型需要4个字节,因此两个指针都指向相同的int,两个指针都通过内存对齐具有相同的值,你得到0结果。

答案 3 :(得分:0)

当你减去两个指针时,只要它们指向同一个数组,结果就是分隔它们的元素数量。

Pointer Subtraction and Comparison

答案 4 :(得分:0)

同一阵列的元素的内存地址始终是顺序的。即 如果myarray [0]的记忆地址是:

 0x4000000

那么myarray [2]的内存地址肯定是

 0x4000002

因此,当您将arr的地址存储到ptr1时,假设它是 x ,然后当你设置ptr2的地址时,三个单位高于而不是ptr1,它将是 x + 3 。所以当你从ptr2中减去ptr1时,答案就是:

  

x +3) - x = 3

因此答案。

在第二个 printf()语句中,如果希望它显示与上面相同的结果(3),则必须将指针转换为int而不是{{1 }}。

int*

所以在你的情况下:

char *myvar; // given contents somewhere
int addr = (int)myvar; // addr now = the char pointer