Вопрос

У меня есть следующий код:

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' это (маленькое) целое число. Вы храните их как charS в 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 байт в массив ЧАР.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top