c1 - локальный указатель, поэтому он должен находиться в стеке;
Правильно.Хотя это также может быть размещено в регистре процессора.
c2 - статический указатель, он должен быть в куче;
Нет.Переменная, объявленная как статическая, или переменная, объявленная как глобальная («область действия файла»), имеют то, что называется статическая продолжительность хранения .Это означает, что они должны быть инициализированы до известного значения перед вызовом программы.Если программист не инициализирует их явно, компилятор обеспечит, чтобы они были установлены на ноль.
Чтобы упростить статическую инициализацию, все такие объекты статической длительности хранения обычно помещаются в отдельную выделенную часть ОЗУ,часто называется .bss .Маловероятно, что .bss будет помещен в стек.
c3 находится в куче.
Фактический указатель C3 находится в стеке, но его содержимоеточки в куче.Единственные переменные, которые находятся в куче, это те, которые вы динамически распределяете с помощью malloc ().Ничего другого там нет.
Мое предположение и график не так ли?
C1 правильно, указатель указывает на строковый литерал родата, который хранится в разделе только для чтенияпамяти.
C2 неверно, поскольку он находится в .bss.Тем не менее, он указывает на строковый литерал родаты, как на вашем графике.
C3 неверно.Когда вы что-то используете strcpy (), вы делаете печатную копию строкового литерала в родате и сохраняете эту копию в куче в области, на которую указывает C3.Сам C3 находится в стеке.
РЕДАКТИРОВАТЬ: Не уверен, что стоит этот график, но вот вы.
stack .bss rodata heap
| | | | | | | |
| c1 |-------------->| "abc" | | |
| | | c2 |--->| "abc" | | |
| c3 |----------------------------->|abc |
| | | | | | | |