Я думаю, мы можем предположить, что это теоретический вопрос, который, учитывая дополнительные предположения, не определенные в вопросе (т. Е. Порядок байтов, заполнение) - вопрос отвечает. Но, как указывает @chux, существуют стандарты против такого поведения. Ибо, если это разрешено, код приводит к повреждению памяти стека. В качестве вопроса экзамена на самом деле вы спрашиваете диаграмму, какая память повреждена.
Если я интерпретировать вопрос правильно, то возможно представление памяти (предполагая, что целые числа являются LSB, есть 1 байт заполнения, и в обратном порядке для объявлений):
| Addr | Value | Desc | | ---- | ----- | ------------------------------ | | 55 | 0x00 | // int i = 0; | | 56 | 0x00 | | | 57 | 0x00 | | | 58 | 0x00 | | | 59 | 0x01 | // int ai[] = { 1, 2 }; | | 60 | 0x00 | | | 61 | 0x00 | | | 62 | 0x00 | | | 63 | 0x02 | | | 64 | 0x00 | | | 65 | 0x00 | | | 66 | 0x00 | | | 67 | 0x62 | // char b = 'b'; | | 68 | 0x61 | // char a = 'a'; |
петля, раскатывают, имеет значение:
[68] = 0x7a; // 'z'; [67] = 0x7a; // 'z'; [66] = 0x7a; // 'z'; [65] = 0x7a; // 'z'; [64] = 0x7a; // 'z'; [63] = 0x7a; // 'z'; [62] = 0x7a; // 'z'; [61] = 0x7a; // 'z';
Так воспоминания представляют переменными, а, б и частей [] массива аи будет поврежден. (Инкорпорейтед @chux замечания о порядке байт. Кроме того, я скорректировал порядок, в котором элементы аи [] появляется как на @chux и комментарии @Peter A. Schneider.)
| Addr | Value | Desc | | ---- | ----- | ----------------------------------------- | | 55 | 0x08 | // int i = 8; | | 56 | 0x00 | | | 57 | 0x00 | | | 58 | 0x00 | | | 59 | 0x01 | // int ai[] = { 0x7a7a0001, 0x7a7a7a7a }; | | 60 | 0x00 | | | 61 | 0x7a | | | 62 | 0x7a | | | 63 | 0x7a | | | 64 | 0x7a | | | 65 | 0x7a | | | 66 | 0x7a | | | 67 | 0x7a | // char b = 'z'; | | 68 | 0x7a | // char a = 'z'; |
'* (& аи) '- ужасная идея, учитывая код. –
Это не умножение, то есть разыменование указателя. –
Нет умножения, это унарный оператор разыменования указателя префикса. Вам нужно изучить основы C. – unwind