Home > Net >  Subtracting two following addresses that containing ints returns 1 and not 4 as expected
Subtracting two following addresses that containing ints returns 1 and not 4 as expected

Time:12-22

#include <stdio.h>

int main()
{
    int a[5] = {1,2,3,4,5};
    int *p = a;
    int *q = p  ;
    int b = p-q;
    printf("%d", b);
    return 0;
}

p is pointing on the 2 and q is pointing to the 1. I know that Integer takes 4 bytes in the memory, so correct me if I am wrong, but for example if the address of a[0] is 1000, then the address of a[1] will be 1004

if so, why does subtracting these addresses give us 1 and not 4?

CodePudding user response:

Well, you have clearly misunderstood how pointer arithmetic works.

Consider this:

int a[5] = {1,2,3,4,5};
int *p = a;
p = p   1;

Now where do you expect p to point? At 2, i.e. at a[1]? Or did you expect it to point in the middle of 1, i.e. in the middle of a[0]?

The answer is that p points to a[1].

Now consider

int a[5] = {1,2,3,4,5};
int *p = a;
int *q = a;
p = p   1;
int b = p-q;

and do some simple substitution:

int b = p-q;

since

p is a   1
q = a

we get

int b = (a   1) - a;

which is

int b = 1;

So obviously the result is 1.

CodePudding user response:

From C11 Standard#6.5.6p9 [emphasis added]

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements. The size of the result is implementation-defined, and its type (a signed integer type) is ptrdiff_t defined in the <stddef.h> header. ....

From this:

The subscript which specifies a single element of an array is simply an integer expression in square brackets.

    int a[5] = {1,2,3,4,5};
    int *p = a;
    int *q = p  ;

Both pointer p and q pointing to elements of same array object i.e. array a. Pointer p is pointing to second element of array a, which is a[1] (subscript is 1) and pointer q is pointing to first element of array a, which is a[0] (subscript is 0).

The result of p - q is 1 - 0 which is equal to 1. Hence, you are getting output 1.

Ideally, the type of b should be ptrdiff_t and provide %td format specifier to printf() for b:

    ptrdiff_t b = p - q;
    printf("%td", b);
  • Related