Почему разыменование 2 раза работает и 3 раза дает ошибку сегментации

как он печатает элемент трехмерного массива с двумя разыменованиями. Я думал, что нужно что-то вроде 3 разыменования printf("%c",*(*(*(a+0)+1)+1));. кризис понимания.

int main() 
{ 
    char a[2][3][3] = {'a','b','c','d','e','f','g', 
                           'h','i','j','k','l','m'}; 
    printf("%s ", **a); 
    getchar(); 
    return 0; 
} 
%s ожидает строку с завершением. Что ты им даешь?
WhozCraig 26.10.2018 07:35

почему ** рабочий @WhozCraig. автоматически добавляется нулевой символ

givil 26.10.2018 07:36

«Он не дает сбоев, когда я запускаю его, и похоже, что он делает что-то разумное» не означает «он работает». % s ошибается, точка. Сначала исправьте это.

Sami Kuhmonen 26.10.2018 07:39
printf("%c",*(*(*(a+0)+1)+1)); не вызывает для меня ошибок сегментации.
P.W 26.10.2018 07:45

@ P.W но *** причина почему

givil 26.10.2018 07:50

@givil: *** a - это то же самое, что и *(*(*(a+0)+0)+0), поэтому не должно. Это не для меня. Используя %c.

P.W 26.10.2018 07:54
**a имеет тип char [3], то есть символьный массив. При передаче в качестве аргумента он распадается на char *. Но ***a имеет тип char, который представляет собой просто целочисленный тип. Это не указатель. Это одиночный персонаж. Используйте %c для форматирования одного символа, а не %s.
Tom Karzes 26.10.2018 07:55

Мы надеемся, что компилятор должен пожаловаться на небрежный стиль скобок, после чего вам следует исправить свой список инициализаторов и выделить место для нулевого завершения.

Lundin 26.10.2018 11:51
0
8
60
1

Ответы 1

Аргумент, предоставленный для указанного %s, должен быть указателем. Для '% s,printfuses the pointer to fet characters from memory. Therefore, for a three-dimensional array, applying two * to the name results in the correct type, a pointer tochar`.

Для %c аргументом должен быть int с символьным значением. Это достигается применением трех * к массиву.

Примечание. Хотя **a предоставляет правильный тип для %s, предполагается, что аргумент указывает на символ в одномерной строке с завершающим нулем. Разрешить символам продолжать работу в разных измерениях массива - хитрость.

Другие вопросы по теме