Шо таке &[] ?
От: BArt  
Дата: 12.02.04 12:51
Оценка: 9 (2)
//пусть 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]?
Re: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 12.02.04 12:56
Оценка:
BA>так сколько это? &a это ведь int(*)[3]?

И каким размер указателя на массив, по-твоему, должен быть?
Of course, the code must be complete enough to compile and link.
Re: Шо таке &[] ?
От: VNG Беларусь https://organicmaps.app/
Дата: 12.02.04 13:00
Оценка:
Здравствуйте, BArt, Вы писали:

BA>//пусть sizeof(int)=4, sizeof(&b) = 4

BA>int a[3];
BA>int b;

BA>b = sizeof(a); //понятно b = 12

BA>b = sizeof(&a); //непонятно b = ?

BA>все компиляторы которые пробовал выдают b = 12 при выполнении,

BA>но в режиме отладки пишешь в watch -> sizeof(&a) получаешь 4

Все верно он тебе пишет

BA>так сколько это? &a это ведь int(*)[3]?


&a — это (int[3])*, а размер указателя для 32-разрядного приложения равен 4.
Re[2]: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 12.02.04 13:03
Оценка:
VNG>&a — это (int[3])*, а размер указателя для 32-разрядного приложения равен 4.

В данном случае &a имеет тип int (*)[3], как и написал автор. А вот что такое (int[3]) * ???
Of course, the code must be complete enough to compile and link.
Re[2]: Шо таке &[] ?
От: BArt  
Дата: 12.02.04 13:04
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

BA>>так сколько это? &a это ведь int(*)[3]?


L_L>И каким размер указателя на массив, по-твоему, должен быть?


я думаю 4, но почему в результате выполнения получается b = 12 ?
Re[3]: Шо таке &[] ?
От: BArt  
Дата: 12.02.04 13:05
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

VNG>>&a — это (int[3])*, а размер указателя для 32-разрядного приложения равен 4.


L_L>В данном случае &a имеет тип int (*)[3], как и написал автор. А вот что такое (int[3]) * ???

и я не знаю...
Re[3]: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 12.02.04 13:08
Оценка:
sizeof(a) это размер массива, т.е., в нашем случае 12. Здесь нет преобразования массива в указатель. Потому именно 12!
sizeof(&a) это размер указателя на массив, т.е., в нашем случае 4.
Of course, the code must be complete enough to compile and link.
Re[4]: Шо таке &[] ?
От: VNG Беларусь https://organicmaps.app/
Дата: 12.02.04 13:23
Оценка:
Здравствуйте, 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 ); // указатель на массив
Re[4]: Шо таке &[] ?
От: Bell Россия  
Дата: 12.02.04 13:24
Оценка: +1
Здравствуйте, 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


И это несколько неожиданно...
Интересно посмотреть на поведение других компиляторов...
Любите книгу — источник знаний (с) М.Горький
Re[5]: Шо таке &[] ?
От: VNG Беларусь https://organicmaps.app/
Дата: 12.02.04 13:35
Оценка:
Здравствуйте, Bell, Вы писали:

B>Лично я ожидал вывода

B>
B>12
B>4
B>4
B>4
B>

B>однако VC6 решил все иначе:
B>
B>12
B>12
B>4
B>4
B>


B>И это несколько неожиданно...

B>Интересно посмотреть на поведение других компиляторов...

Мистика MSVC++7.1 тоже выводит:
12
12
4
4
Re[5]: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 12.02.04 13:47
Оценка:
Мсье 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.
Re[6]: Шо таке &[] ?
От: BArt  
Дата: 12.02.04 13:59
Оценка:
B>>И это несколько неожиданно...
B>>Интересно посмотреть на поведение других компиляторов...

VNG>Мистика MSVC++7.1 тоже выводит:

VNG>12
VNG>12
VNG>4
VNG>4

проверял на BC3.1 Builder6.0 VC6.0 VC7 везде 12
дело в том что я пишу компилятор С и натыкаюсь на такие фичи,
голова раскалывается не знаю как трактовать выражения и результаты,
и этот пример еще не самый непонятный
Re[6]: Шо таке &[] ?
От: Bell Россия  
Дата: 12.02.04 14:00
Оценка:
Здравствуйте, 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...


ЗЫ
А почему "мсье"?
Любите книгу — источник знаний (с) М.Горький
Re[7]: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 12.02.04 14:23
Оценка: 7 (1)
B>А почему "мсье"?

Я хотел достойно ответить, повторяться (сэр) не хотелось, потому ничего лучше не придумал

Про комо
template<int>
class A{};

void g()
{
   int a[3] = {};
   A<4> test;
   test = A<sizeof(&a)>();
}
Of course, the code must be complete enough to compile and link.
Re[8]: Шо таке &[] ?
От: Bell Россия  
Дата: 12.02.04 14:29
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Про комо

L_L>
L_L>template<int>
L_L>class A{};

L_L>void g()
L_L>{
L_L>   int a[3] = {};
L_L>   A<4> test;
L_L>   test = A<sizeof(&a)>();
L_L>}
L_L>


Мда, что и ожидалось.
Теперь все сомненья развеялись.
Любите книгу — источник знаний (с) М.Горький
Re[9]: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 12.02.04 14:32
Оценка:
B>Теперь все сомненья развеялись.

Так они все таки были у тебя?
Of course, the code must be complete enough to compile and link.
Re[10]: Шо таке &[] ?
От: Bell Россия  
Дата: 12.02.04 14:38
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

B>>Теперь все сомненья развеялись.


L_L>Так они все таки были у тебя?


Я же говорил — "Но меня несколько смутили ..."
т.е. не то что сомнения, а какое-то нежелание верить в то, что этот баг присутствует во стольких компиляторах одновременно. Я, если честно, до сих пор не встречал подобного...
Любите книгу — источник знаний (с) М.Горький
Re[11]: Шо таке &[] ?
От: Аноним  
Дата: 12.02.04 14:44
Оценка: +1
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Lorenzo_LAMAS, Вы писали:


B>>>Теперь все сомненья развеялись.


L_L>>Так они все таки были у тебя?


B>Я же говорил — "Но меня несколько смутили ..."

B>т.е. не то что сомнения, а какое-то нежелание верить в то, что этот баг присутствует во стольких компиляторах одновременно. Я, если честно, до сих пор не встречал подобного...

вы еще не видели какой VS7 тип в watches мне написал:
int a[3];

&a -> char*
Re[12]: Шо таке &[] ?
От: BArt  
Дата: 13.02.04 05:51
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Lorenzo_LAMAS, Вы писали:


B>>>>Теперь все сомненья развеялись.


L_L>>>Так они все таки были у тебя?


B>>Я же говорил — "Но меня несколько смутили ..."

B>>т.е. не то что сомнения, а какое-то нежелание верить в то, что этот баг присутствует во стольких компиляторах одновременно. Я, если честно, до сих пор не встречал подобного...

И ишшо добавлю, что меня не покидает ощущение, что
int b[3];

то тип &b --> int b[1][3] так 12 получается и с указателями вроде все впорядке....
Re[13]: Шо таке &[] ?
От: Lorenzo_LAMAS  
Дата: 13.02.04 07:09
Оценка:
Обратного преобразования — указателя в массив — нет
Of course, the code must be complete enough to compile and link.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.