//пусть sizeof(int)=4, sizeof(&b) = 4
int a[3];
int b;
b = sizeof(a); //понятно b = 12
b = sizeof(&a); //непонятно b = ?
все компиляторы которые пробовал выдают b = 12 при выполнении,
но в режиме отладки пишешь в watch -> sizeof(&a) получаешь 4
так сколько это? &a это ведь int(*)[3]?
Здравствуйте, Lorenzo_LAMAS, Вы писали:
VNG>>&a — это (int[3])*, а размер указателя для 32-разрядного приложения равен 4.
L_L>В данном случае &a имеет тип int (*)[3], как и написал автор. А вот что такое (int[3]) * ???
и я не знаю...
sizeof(a) это размер массива, т.е., в нашем случае 12. Здесь нет преобразования массива в указатель. Потому именно 12!
sizeof(&a) это размер указателя на массив, т.е., в нашем случае 4.
Of course, the code must be complete enough to compile and link.
Здравствуйте, BArt, Вы писали:
BA>Здравствуйте, Lorenzo_LAMAS, Вы писали:
VNG>>>&a — это (int[3])*, а размер указателя для 32-разрядного приложения равен 4.
L_L>>В данном случае &a имеет тип int (*)[3], как и написал автор. А вот что такое (int[3]) * ??? BA> и я не знаю...
Да здесь я заглючил . Корректнее будет так:
int a[3];
int (* p)[3] = &a;
assert ( sizeof(p) == 4 ); // указатель на массив
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>sizeof(a) это размер массива, т.е., в нашем случае 12. Здесь нет преобразования массива в указатель. Потому именно 12! L_L>sizeof(&a) это размер указателя на массив, т.е., в нашем случае 4.
Сэр Лоренцо! Вы были невнимательны — BArt привел действительно интересный пример.
int main()
{
int a[3];
int (*pa)[3] = &a;
int n1 = sizeof(a);
int n2 = sizeof(&a);
int n3 = sizeof(int(*)[3]);
int n4 = sizeof(pa);
cerr << n1 << endl << n2 << endl << n3 << endl << n4 << endl;
return 0;
}
Лично я ожидал вывода
12
4
4
4
однако VC6 решил все иначе:
12
12
4
4
И это несколько неожиданно...
Интересно посмотреть на поведение других компиляторов...
Мсье Bell, я действительно не просек фичи. А мнения других компиляторов уже неинтересны, глюк очередной. Но все же, чтоб успокоить :
Intel 8.0 for Windows 4
Intel 7.1 for linux 4
g++ 3.2.3 4
Of course, the code must be complete enough to compile and link.
B>>И это несколько неожиданно... B>>Интересно посмотреть на поведение других компиляторов...
VNG>Мистика MSVC++7.1 тоже выводит: VNG>12 VNG>12 VNG>4 VNG>4
проверял на BC3.1 Builder6.0 VC6.0 VC7 везде 12
дело в том что я пишу компилятор С и натыкаюсь на такие фичи,
голова раскалывается не знаю как трактовать выражения и результаты,
и этот пример еще не самый непонятный
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Мсье Bell, я действительно не просек фичи.
L_L>А мнения других компиляторов уже неинтересны, глюк очередной. Но все же, чтоб успокоить : L_L>Intel 8.0 for Windows 4 L_L>Intel 7.1 for linux 4 L_L>g++ 3.2.3 4
Да, это действительно очень похоже на баг. Но меня несколько смутили слова автора "все компиляторы которые пробовал" — наличие подобного бага в нескольких компиляторах как-то настораживает. Твой список (вроде вполне достойные компиляторы) тоже не добавляет уверенности...
Осталось посмотреть на реакцию Comeau...
Здравствуйте, Lorenzo_LAMAS, Вы писали:
B>>Теперь все сомненья развеялись.
L_L>Так они все таки были у тебя?
Я же говорил — "Но меня несколько смутили ..."
т.е. не то что сомнения, а какое-то нежелание верить в то, что этот баг присутствует во стольких компиляторах одновременно. Я, если честно, до сих пор не встречал подобного...
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Lorenzo_LAMAS, Вы писали:
B>>>Теперь все сомненья развеялись.
L_L>>Так они все таки были у тебя?
B>Я же говорил — "Но меня несколько смутили ..." B>т.е. не то что сомнения, а какое-то нежелание верить в то, что этот баг присутствует во стольких компиляторах одновременно. Я, если честно, до сих пор не встречал подобного...
вы еще не видели какой VS7 тип в watches мне написал:
int a[3];
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Bell, Вы писали:
B>>Здравствуйте, Lorenzo_LAMAS, Вы писали:
B>>>>Теперь все сомненья развеялись.
L_L>>>Так они все таки были у тебя?
B>>Я же говорил — "Но меня несколько смутили ..." B>>т.е. не то что сомнения, а какое-то нежелание верить в то, что этот баг присутствует во стольких компиляторах одновременно. Я, если честно, до сих пор не встречал подобного...
И ишшо добавлю, что меня не покидает ощущение, что
int b[3];
то тип &b --> int b[1][3] так 12 получается и с указателями вроде все впорядке....