Расположение разыменованного неинициализированного указателя в памяти?

#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 , если только ваша конкретная реализация не документирует, как именно обрабатываются неинициализированные указатели.