#c #pointers #embedded #memory-segmentation #static-memory-allocation
#c #указатели #встроенный #сегментация памяти #статическое выделение памяти
Вопрос:
У меня есть этот пример кода на c из вводного теста курса по встроенной системе :
#include <stdlib.h>
#include <stdint.h>
//cross-compiled for MSP432 with cortex-m0plus
int main() {
int * l2;
return 0;
}
Я хочу знать сегмент памяти, подсегмент, разрешения и время жизни *l2 в памяти.
Я понимаю, что указатель l2 сначала будет выделен в подсегменте стека, а затем, поскольку он неинициализирован, он получит мусорное значение, которое в данном случае является любым значением, которое он находит в стеке; Я предположил, что оно находится в .text или .const со статическимвремя жизни и ни один из этих ответов не был правильным, так что я что-то здесь упускаю?
Редактировать:
После того, как я прошел тест, не решив этот вопрос правильно, в таблице решений указано, что он находится в куче с неопределенным временем жизни. что я получил из этого ответа, так это то, что: поскольку сам указатель хранится в стеке, а объект, на который он указывает, неинициализирован (он не автоматический или статический), он хранится в куче .. я полагаю??
Комментарии:
1. Для меня ваш вопрос неясен. Сначала вы говорите, что я понимаю… будет выделено в стеке , а позже вы скажете, что я предположил, что это было в .text или .const со статическим временем жизни , пожалуйста, объясните?
2. Если вы не вызываете функцию
main
рекурсивно (вероятно, это не так), то время жизниl2
будет примерно таким же, как у переменной со статическим временем жизни. Он будет уничтожен только приmain
возврате, что очень незадолго до того, как все переменные со статическим временем жизни будут уничтожены.3. @AndreasWenzel Не обязательно: godbolt.org/z/xYeno7 наша программа будет выполняться вечно, но этот объект уже давно закончил свою жизнь
4. @P__J__: Хорошо, вы правы, есть надуманные примеры, где это не так. 🙂
5. @4386427 я хотел объяснить мыслительный процесс, стоящий за моими неправильными ответами, чтобы любой мог исправить мое недоразумение.
Ответ №1:
Это зависит от реализации.
Обычно, поскольку это локальная автоматическая переменная, она будет расположена в стеке. Его время жизни совпадает с временем жизни main
функции. К нему можно получить доступ только из функции main .
Но в реальной жизни, поскольку вы ничего с ним не делаете, он будет просто удален компилятором как ненужный, даже если вы скомпилируете его без каких-либо оптимизаций https://godbolt.org/z/1Y6W5j . В этом случае его местоположение равно «нигде»
Объекты также могут храниться в регистрах и не помещаться в память https://godbolt.org/z/8nWxxz
Большинство современных реализаций C помещают код в .text
сегмент, инициализируют статические переменные местоположения хранилища в .data
сегменте, не инициализируют статические переменные местоположения хранилища в .bss
сегменте и данные только для чтения в .rodata
сегменте. В вашей программе может быть много других сегментов памяти, но есть так много вариантов. Вы также можете иметь свои собственные сегменты и размещать там объекты.
Расположение стека и кучи на 100% определено реализацией.
Ответ №2:
Значение, хранящееся в l2
, не определено — оно может быть даже представлением ловушки. Сам l2
объект имеет auto
продолжительность хранения, и его время жизни ограничено временем жизни заключающей функции. Что это означает с точки зрения сегмента памяти, зависит от конкретной реализации.
Вы ничего не можете сказать о значении *l2
, если только ваша конкретная реализация не документирует, как именно обрабатываются неинициализированные указатели.