Home > Software design >  Pointer arithmetic in C not pointing to the correct variables if I don't print the address of t
Pointer arithmetic in C not pointing to the correct variables if I don't print the address of t

Time:10-24

So I'm doing pointer arithmetic homework and I need to decrement and increment pointers with this as its expected outcome. This is what I did

#include <stdio.h>

void main(void){
    int d = 10;
    int c = 8;
    int b = 6;
    int a = 4;

    int *ptr; //these lines are given

    printf("decrement \n");
    for (ptr = &d; ptr >= &a; ptr--)
    {
        printf("%d \n",*ptr);
    }

    printf("increment \n");
    for (ptr = &a; ptr <= &d; ptr  )
    {
        printf("%d \n",*ptr);
    }
}

But the results skip 8 and 6:

decrement
10
4
increment
4
10

And so I decided to print the addresses at the beginning to help debug

    printf("%p\n",(void*)&d);
    printf("%p\n",(void*)&c);
    printf("%p\n",(void*)&a);
    printf("%p\n",(void*)&b);

But after running it, it just works

000000fc6a9ffb34
000000fc6a9ffb30
000000fc6a9ffb28
000000fc6a9ffb2c
decrement
10
8
6 
4
increment
4
6
8
10

So I know that the logic works out, but it just doesn't work without printing first and I don't know why

I'm using Vscode and GCC

CodePudding user response:

So I know that the logic works out, but it just doesn't work without printing first

Undefined behavior (UB), anything may happen.


int d = 10;
int a = 4;
int *ptr = &d; 
    ptr >= &a

ptr >= &a is undefined behavior (UB).

Order comparisons of pointers in C are UB when not part of the same array (or one after).

ptr-- is also UB as that attmepts to form the address before d. Pointer math only good within an array/object (or one after)

CodePudding user response:

In your first example, you are not using variables b and c, just a and d - therefore (I suspect) the implementation is optimizing them away

In the second example, you are using variables all four variables a, b, c and d therefore they cannot be optimised away

CodePudding user response:

your program have four different variables not an array of size four. So address of variables is unpredictable.

    int d = 10;
    int c = 8;
    int b = 6;
    int a = 4;

in Array memory is allocated contiguously, so use array if you want to do so.

#include<stdio.h>
int main(){
    int arr[4] = {1, 2, 3, 4};
    // increment
    for(int i=0; i<4; i  )
        printf("%d\n",*(arr   i));
    // decrement
    printf("-------------------------------\n");
    for(int i=3; i>=0; i--)
        printf("%d\n",*(arr   i));
    return 0;
}
  •  Tags:  
  • c gcc
  • Related