Почему разыменование 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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, предполагается, что аргумент указывает на символ в одномерной строке с завершающим нулем. Разрешить символам продолжать работу в разных измерениях массива - хитрость.

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