LINUX.ORG.RU

Определение массива. Отображение в памяти

 ,


1

3

Внезапно осознал, что любое определение массива (например int mas[7];) порождает в памяти не такую структуру:

    mas
    ┏━┳━┳━┳━┳━┳━┳━┓
    ┗━┻━┻━┻━┻━┻━┻━┛

а такую:

    mas
    ┏━┓
    ┗━┛
     |
     |
     ∨
    ┏━┳━┳━┳━┳━┳━┳━┓
    ┗━┻━┻━┻━┻━┻━┻━┛

И так всегда. То есть, при определении массива выделяется место в памяти и под элементы, и под указатель на сам массив. Всегда! Офигеть...

В KnR, конечно, написано что имя массива - указатель на первый элемент, но вот этой схемки нет, и объяснения, как выделяется место, тоже нет.

UPD: я тупой, все что выше - неверно.

Перемещено mono из talks



Последнее исправление: Moonysh (всего исправлений: 2)

Ответ на: комментарий от oneliner

Я сидел искал, подбирал и рисовал в юникоде целых 5 минут эти долбанные рамочки, чтобы ты мне просто ответил «нет»? =(

Почему нет?

Moonysh
() автор топика

И что же навело тебя на это неверное предположение?

arturpub ★★
()
Ответ на: комментарий от Moonysh

Автоматический это сдвиг стека на семь и неявный индекс от ebp, статический это семь элементов в секции и захардкоженный линкером оффсет в ней. Где ты видишь явное резервирование места под указатель?

arturpub ★★
()

Следует уточнить, какой компилятор используется. Также можно очень просто проверить — нагенерить много одноэлементных массивов и посмотреть, сколько памяти сожрало приложение. Это если не хочется посидеть с дебагером и посмотреть, чего там на самом деле происходит.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 1)
Ответ на: комментарий от arturpub

Если често - нигде.
А если еще честнее - то что такое регистр EBP я узнал 3 минуты назад. У меня есть четкое чувство, что мне нужно разобраться с ассемблером. Вы можете посоветовать книгу по Ассемблеру которая сродни KnR для Си? Или просто хорошую, понятную и небольшую книгу по Ассемблеру?

Moonysh
() автор топика

Если ты делаешь так : int* data = new data[N] то указатель будет на стеке, а то на что он указывает - в куче.

ranka-lee
()

Ты еще про ведро почитай, как оно память выделяет...

Eddy_Em ☆☆☆☆☆
()

int mas[7]; именно как ваш первый рисунок создает в памяти.

int *mas[5] создаст неинициализированный массив из 5 указателей, затем вы можете как-то так его инициализировать.

for (c = 0; c < 5; c++) {
  mas[c] = malloc(sizeof(int)*100);
}
IvanR ★★★
()

Внезапно осознал, что любое определение массива (например int mas[7];) порождает в памяти не такую структуру:

facepalm

UPD: я тупой, все что выше - неверно.

пойду тред почитаю ☺

emulek
()
Ответ на: комментарий от Moonysh

Я сидел искал, подбирал и рисовал в юникоде целых 5 минут эти долбанные рамочки

кстати вим умеет. Да, и рамочки тоже.

emulek
()
Ответ на: комментарий от Sadler

Следует уточнить, какой компилятор используется.

нет. В стандарте явно сказано, что размер массива == размер всех его эл-тов.

с дебагером и посмотреть, чего там на самом деле происходит.

sizeof посмотри.

emulek
()
Ответ на: комментарий от IvanR

int *mas[5] создаст неинициализированный массив из 5 указателей

это если в стеке. А если static, то инициализированных NULL.

emulek
()
Ответ на: комментарий от IvanR

лучше-бы я этого говна не видел. Не буду тебе объяснять, кто ты. А то ведь по 5.2 забанят. Но у тебя в каждой строке наглое 5.2...

emulek
()
Ответ на: комментарий от emulek

нет. В стандарте явно сказано, что размер массива == размер всех его эл-тов.

А вот ТС утверждает, что создаётся ещё и ссылка. Возможно, компилятор не полностью соответствует стандарту.

sizeof посмотри.

Не ко мне.

Sadler ★★★
()
Ответ на: комментарий от Sadler

А вот ТС утверждает, что создаётся ещё и ссылка. Возможно, компилятор не полностью соответствует стандарту.

перечитай. ТС уже осознал, что был пьян и т.п.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.