Программа обычно загружается в память с такой структурой: стек, файлы Mmap, куча, BSS (неинициализированные статические переменные), сегмент данных (инициализированные статические переменные) и текст (скомпилированный код)
YouВы можете узнать больше здесь: https://manybutfinite.com/post/anatomy-of-a-program-in-memory/
В зависимости от того, как вы объявите переменную, она перейдет в одно из мест, упомянутых ранее.
Компилятор упорядочит переменные сегмента BSS и Data, как онпожелания по компиляции, поэтому обычно нет шансов.Ни одна из кучных переменных (ОС получит блок памяти, который лучше соответствует выделенному пространству)
В стеке (который является структурой LIFO) переменные помещаются одна над другой, так что если у вас есть:
int a = 5;
int b = 10;
Можно сказать, что a и b будут располагаться один за другим.Таким образом, в этом случае вы можете сказать.
Есть еще одно исключение, и это то, что если переменная является структурой или массивом, они всегда размещаются, как я уже говорил, каждый после последнего.
В вашем коде ptr1 - это массив массивов символов, поэтому он будет следовать исключению, которое я сказал.
Фактически, выполните следующее упражнение:
#include <stdio.h>
#include <string.h>
int main(){
const char * const ptr1[] = {"to be","or not to be","that is the question"};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < strlen(ptr1[i]); j++)
printf("%p -> %c\n", &ptr1[i][j], ptr1[i][j]);
printf("\n");
}
}
, и вы увидитеадрес памяти и его содержимое!
Хорошего дня.