Разница между массивом указателей и двумерным массивом - PullRequest
0 голосов
/ 01 октября 2018
int *m[10], n[10][10];
int a[] = {1,2,3,4,5,6,7,8,9,10};
m[4] = a;

Что из перечисленного может выдать ошибку при попытке напечатать значение и почему?(Предположим, что даже n [10] [10] инициализируется должным образом)

1) m[2][4]
2) n[2]
3) m[3]

(PS: пожалуйста, объясните подробно)

1 Ответ

0 голосов
/ 02 октября 2018

Компилятор не будет жаловаться, когда вы пытаетесь создать каждую из этих вещей, но вы, скорее всего, не получите ожидаемые значения распечатки.

int *m[10] создает массив из 10 указателей наИнтс.Это может указывать на 10 различных целых или (как я подозреваю, вы думаете) это может указывать на 10 «массивов» целых.Проблема здесь в контексте (это часто в C);мы не знаем точно, что вы пытаетесь сделать.int* указывает на область памяти, которая содержит int.Это может быть один int или массив ints.Ваш код не имеет никакой другой информации о настройке - не malloc'ing или установка указателя, равного адресу int - поэтому мы не знаем.Когда вы распечатываете его, мы не знаем, что вы можете получить, так как память, кажется, еще не создана (в соответствии с кодом, который мы видим здесь).

n [10] [10]собирается (в большинстве систем) автоматически устанавливаться в массив 10x10, инициализированный в 0 - но мы не можем на это рассчитывать.Независимо от того, мы не знаем, что собирается распечатать.Если вы печатаете, используя printf, вы можете напечатать значение адреса памяти, которое хранится в n [2].Наверное, не то, что вы хотите.Если вы не распечатываете его как указатель, а вместо этого используете модификатор% d printf, компилятор, скорее всего, выдаст предупреждение, но разрешит его.То, что распечатывается, будет адрес, интерпретируемый как целое число.Возможно, это не то, что вам нужно.

Распечатка m [3] - это та же проблема, что и при n [2], относительно того, печатает ли она int или указатель.Однако (возможно) в отличие от памяти nm не отображается (из вашего кода), чтобы когда-либо устанавливать.Скорее всего (в большинстве систем) распечатает 0, так как он по умолчанию установлен в нулевой указатель.Опять же, я не знаю, на что мы можем рассчитывать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...