tags:

views:

109

answers:

3

Hi have made this function which is made to replicate an error that I can't get past. It looks like this:

void enumerate(double *c, int size){
    while(c < &c[size]){
            printf("%lf\n", *c);
            c++;
    }

}

I have added some printf's in there and it gives me:

Adressof c: 0x100100080, Adressof c + size: 0x1001000a8

I then also print the address of c for each iteration of the loop, it reaches 0x1001000a8 but continues past this point even though the condition should be false as far as I can tell until I get a segfault. If anyone can spot the problem, please tell me, I have been staring at this for a while now.

Thanks.

+5  A: 

You're using the current value of c in both sides of your loop condition, and you're increasing c every iteration. c will never reach the address of itself plus anything.

Save the address of c[size] before you enter the loop, and you'll eventually reach it.

void enumerate(double *c, int size) {
    double *addr = &c[size];
    while(c < addr) {
            printf("%lf\n", *c);
            c++;
    }
}
Dewb
Thank you, I can see it now.
Fred
+4  A: 

Hi Fred,

The problem is the condition checking itself....

while(c < &c[size])

Withing the while loop you are incrementing c.

So both c and &c[size] will go on incrementing, since the second address is relative to the current value of c.

A better way would be :

void enumerate(double *c, int size){
    double *ptr = c;
    while(c < &ptr[size]){
            printf("%lf\n", *c);
            c++;
    }
}
Furquan
Yes! It's obvious now, ha. Thank you.
Fred
A: 

Each time you reach c++, the value of &c[size] also changes. So, the condition is always true.

Vulcan Eager