Ошибка в вычислениях адресов у GCC ?

Do you have a question? Post it now! No Registration Necessary

Threaded View
Hello, All!

 Работаю с GCC для ARM и обнаружил одну странность. Вот исходный код:

unsigned long a[4];
volatile unsigned int  i;
void f()
{
 i=(&(a[1]))-(&(a[0]));
}

 После компиляции (оптимизация выключена) получается:
        ....
        ldr     r2, .L2
        mov     r3, #1        <<<<<<<<<<<<<<<<<<<<<
        str     r3, [r2, #0]
        .....

 Если немного изменить исходный код
 i=(a+1)-(a);
 то ни чего не изменится, а если изменить так:

 i=((int)(&(a[1])))-((int)(&(a[0])));

то получится:

        ldr     r2, .L2
        mov     r3, #4       <<<<<<<<<<<<<<<<<<<<<<
        str     r3, [r2, #0]

 Что кажется более правильным.
 Интересно, это gcc ошибается, или все же я чего-то не понимаю?

With best regards, Leha Bishletov.  E-mail: snipped-for-privacy@rol.ru




Ошибка в вычислениях адресов у GCC ?
Thu Jan 27 2005 11:11, Leha Bishletov wrote to All:

 LB>  i=(&(a[1]))-(&(a[0]));
 LB>  i=(a+1)-(a);
 LB>  то ни чего не изменится, а если изменить так:

по стандарту - количество элементов между двумя указателями

 LB>  i=((int)(&(a[1])))-((int)(&(a[0])));
 LB> то получится:

разница между значениями адресов. Компилятор все нормально делает.

Генка на сервере pochtamt.ru  в ящике mgs2001