void foo()
{
char *c1 = "abc";
static char *c2 = "abc";
char *c3 = malloc(10);
strcpy(c3, "abc");
}
В foo
, я полагаю:локальные указатели, `static` указатели и указатели` malloc`
c1
является локальным указателем, поэтому он должен быть в стеке;
c2
- статический указатель, он должен находиться на куче;
c3
находится на куче.
По моему предположению, я рисую график относительно указателей и строковый литерал они указывают,
stack rodata heap
| | | | | |
| c1 |------>| "abc" |<--------| c2 |
| .. | | | \ | .. |
| | | | `------| c3 |
| | | | | |
Мое предположение и график правильно?
Тем не менее, я не совсем понимаю, почему должно c3
быть на куче? c3
всего лишь char *
, просто указав адрес (расположенный на куче), не делает c3
на куче, не так ли?
Нет, c3 указывает на массив в куче, который теперь содержит «abc»; c2 должен находиться в BSS. c1, однако, находится в стеке. – tbert
c3 находится в стеке, но указывает на кучу. – Matthias