Поскольку я не могу добавлять комментарии только еще, вот мои два цента в ответ:
Если вы хотите узнать, находится ли память в стеке или куче, прочитайте другие ответы, они гораздо более информированы, чем я.
Если вы хотите точно знать, где значения, вы всегда можете распечатать адрес:
printf("address at a[0] = %p\n", (void *)&a[0]);
printf("address at p[0] = %p\n", (void *)&p[0]);
где вы заметите тот же ответ. Но, тогда посмотрите на
printf("address at a[1] = %p\n", (void *)&a[1]);
printf("address at p[1] = %p\n", (void *)&p[1]);
Это веселое упражнение. Просто для удовольствия, запустите следующий код и посмотреть, что вы получите:
p[2] = 'a';
printf("a[0] is %d\n", a[0]);
printf("a[1] is %d\n", a[1]);
printf("p[2] is %d\n", p[2]);
putchar(p[2]);
Я предлагаю вам найти учебник для начинающих на С, потому что это такой вопрос, на самом деле, что C это все о. –
Возможно, я что-то пропустил, но зачем вам нужно знать, хранится ли он в стеке или в куче? Вы пробовали p [0]? Возможно, вы можете задать вопрос, указав, какую проблему у вас есть, чтобы у нас была начальная точка ... – Ray
Как говорит @Ray, в зависимости от того, что вы делаете, это может «не иметь значения» ... и может быть компилятором зависимые по-разному, определяемые операциями, которые вы можете выполнять, а не спецификой реализации. В любом случае, это не единственные два класса хранения ... ну, по крайней мере, на C++ (только что заметил, что это вопрос C, я мало знаю о формализации C ... у кого-то может быть более подходящая ссылка.) Тем не менее, это может быть полезно: http://www.gotw.ca/gotw/009.htm – HostileFork