Как массив хранится в памяти? [закрыто]

У меня есть простая программа, которая инициализирует массив как:

int a[]={10,20,30,40,50};

char *p;

p=(char*)a;

Теперь я хочу получить доступ к значению каждого байта через указательp, Для этого мне нужно знать, как массив хранится в памяти (стек или куча)?

 Alex Lockwood22 мая 2012 г., 07:14
Я предлагаю вам найти учебник для начинающих по Си, потому что этот тип вопроса - это то, о чем вообще говорит Си.
 Jim Balter22 мая 2012 г., 08:12
@ som, почему вы хотите получить доступ к байту массива int? Количество байтов, которые вы получите, равно sizeof (a) * sizeof (int), и их порядок зависит от архитектуры машины.
 HostileFork22 мая 2012 г., 07:18
Как говорит @Ray, в зависимости от того, что вы делаете, это вполне может «не иметь значения» ... и может зависеть от компилятора различными способами, определяемыми операциями, которые вы можете выполнять вместо особенностей реализации. В любом случае, это не единственные два класса хранилища ... ну, по крайней мере, в C ++ (только что заметил, что это был вопрос C, я мало знаю о формализации C ... у кого-то еще может быть более подходящая ссылка. ) Тем не менее, это может быть полезно:gotw.ca/gotw/009.htm
 Jim Balter22 мая 2012 г., 08:05
«Вопрос такого рода - это действительно то, о чем все говорит С». Нет, это не так. & Quot; зачем вам знать, хранится ли он в стеке или в куче? & quot; - Такой необходимости не было заявлено. Вопрос, кажется, о порядке байтов.
 Ray22 мая 2012 г., 07:15
Может быть, я что-то пропустил, но зачем вам знать, хранится ли это в стеке или в куче? Вы пробовали p [0]? Возможно, вы можете задать вопрос, сказав, какая у вас проблема, чтобы у нас была отправная точка ...

Ответы на вопрос(4)

Статически созданный массив будет в стеке или в.data/.bss разделы вашего двоичного файла. Динамически созданный массив (сnew или жеmalloc) будет выделяться в куче.

Решение Вопроса

Массив хранит свои элементы в смежных местах памяти.
Если вы создали массив локально, он будет в стеке. Где хранятся элементы, зависит отstorage specification.
Например:
Массив, объявленный глобально или статически, будет иметь спецификацию хранения, отличную от массива, объявленного локально. Технически,where частьimplementation defined но обычно реализации будут использовать аналогичные шаблоны использования.

An local array will be (usually)created on stack while A global or static array will be (usually)created on bss/data segments and A dynamically created array will be created on heap.

Во-первых, указатель должен иметь тип int. Массив - это просто группа целых чисел, сохраненных в памяти как одно целое число, но в одной строке. Целое число имеет 4 байта в памяти, так что вы можете получить доступ к каждому значению вашего массива, увеличив указатель на 4.

int *p = (int*)a;
for(i = 0; i < 5; i++) {
    p += 4;
    printf("%d ", *p);
}
 22 мая 2012 г., 08:09
Поскольку OP говорит, что он / она хочет получить доступ к каждому байту и явно использует указатель char * и преобразование char *, нет смысла говорить, что указатель должен иметь тип int. Кроме того, целые числа не обязательно должны содержать 4 байта, и очень неправильно добавлять 4 к указателю, поскольку добавление умножается на размер целого числа.

Поскольку я пока не могу добавлять комментарии, вот мои два цента в ответе:

Если вы хотите только узнать, находится ли память в стеке или куче, прочитайте другие ответы, они гораздо более информированы, чем я.

Если вы хотите точно знать, где находятся значения, вы всегда можете напечатать адрес:

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]);
 22 мая 2012 г., 08:25
@HostileFork Ваши очки хорошо приняты. Я решил, что, как новый программист, поскольку Google всегда, кажется, указывает мне на ТАК, я, вероятно, должен присоединиться! Хороший улов на "центах"!
 22 мая 2012 г., 08:07
+1 за то, что вы новичок в SO и предлагаете экспериментировать, что является хорошим способом исследовать и исследовать. Тем не менее, всегда следует помнить, что компиляторы разные. То, что вы наблюдаете закономерность в своих экспериментах, еще не означает, что это «правда». Единственная «правда» в формулировке спецификации, которая делаетsome гарантирует ... но, кроме ошибок компилятора, спецификация все еще сильно зависит от "неопределенного поведения". Кроме того, идиома "два цента" (как в деньгах) ... не "два смысла", хотя это забавно. :)en.wikipedia.org/wiki/Undefined_behavior

Ваш ответ на вопрос