C: Проблема с зазубренными массивами
-
22-09-2019 - |
Вопрос
У меня есть следующий код:
int *edges[500];
char arr[] = {'c','d'};
edges[0] = arr;
printf("%c - %c", edges[0][0],edges[0][1]);
Я хочу отобразить c - d
Но на самом деле отображается c -
Таким образом, как вы можете видеть выше, отображается первый элемент, но не второй.
Почему второй элемент массива не отображается?
Решение
С тех пор int
и char
иметь разные размеры, вы должны попробовать char *edges[500]
Другие советы
Несоответствие типов. edges
это массив из 500 указателей на int, и вы присваиваете указатель двум символам на его первый элемент.
Ну
t.c:6: warning: assignment from incompatible pointer type
Сообщение может иметь какое -то отношение к этому.
В c, 'c'
это (маленькое) целое число. Вы храните их как char
S в arr
. Анкет Однако, получая доступ arr
в качестве edges[0]
который является int *
, вы на самом деле получаете (на большинстве платформ) arr[0]
, arr[1]
, arr[2]
а также arr[3]
как целое число.
edges[0]
интерпретируется как массив int с элементами {(int) 'CD', 0} (фактически, второй элемент может содержать любой мусор).
printf с Specifier %c берет первый байт edges[0][0]
(т.е. 'c') и первый байт edges[0][1]
(который оказался 0).
Изменение типа edges
к char* edgeds[500]
.
строка 3
edges[0] = arr;
несовместимые типы в задании: arr
это char *
а также edges[0]
это int *
.
Что происходит, это:
int *edges[500];
char arr[] = {'c','d'};
arr [0] - это 'c', а arr [1] - 'd'
edges[0] = arr;
Игнорируя совместимость типа, края [0] указывают на int
по адресу, где находятся «C» и «D» (и, возможно, еще два неопределенных символа).
printf("%c %c", edges[0][0],edges[0][1]);
Ряд [0] [0] является первым целым числом в ребрах [0]: это смесь «c», «d» (и возможных еще двух неуточненных символов). Это значение преобразуется в USINGENDEAD CHAR, что дает «C», который печатается.
Ряд [0] [1] указывает на целое число сразу после смесью «C», «D» (и, возможно, еще двух неопределенных символов). Это местоположение памяти не было инициализировано, и оно может быть за пределами диапазона, который может получить доступ к вашему процессу.
Если вы печатаете int вместо 2 Chars
printf("%d\n", edges[0][0]);
Вы увидите смесь «C», «D» (и, возможно, двух неуточненных символов).
Лучшее, что можно сделать, это сделать свои типы правильно.
edges
это множество указателей на инт. Выражение edges[0]
дает указатель на int, а не указать на Чар. Обработка как шар -массив приводит к вычислению неправильного смещения байта, что приводит к отображению значения неожиданной части памяти, а не памяти, удерживающей значение Char 'D'.
Смещение массива рассчитайте смещение в байтах на основе размера типа, указанного на:
foo_t * x;
ptrdiff_t difference = x[1] - x[0];
Значение difference
будет sizeof(foo_t)
байты. sizeof(char)
определяется как 1, и sizeof(int)
Как правило, 4, что означает, что ваш код будет обозначать значение 4 байта в массив ЧАР, а не на 1 байт в массив ЧАР.