Инициализация указателя char*
может выглядеть следующим образом:
char *A = { (char*)(void*)(uintptr_t)5 };
Это присвоит буквальное значение 5
в качестве значения указателя A
.Указатель A
будет указывать (вероятно) на неверную ячейку памяти.
Преобразование (char*)(void*)(uintptr_t)
(или несколько похожее преобразование) может быть выполнено неявно компилятором.Приятно, чтобы компилятор выдавал хотя бы предупреждение о неявном преобразовании целого числа в указатель.
Также вы можете «увеличить» количество элементов в скобках {
}
.Т.е.: * 10101
char* A = { 1, 2, 3, 4, 5, };
1017 * Числа
2, 3, 4, 5,
игнорируются, поскольку
char*
можно инициализировать только из одного значения.
Компилятор должен предупредить вас об этом, напр.в gcc я получаю:
<source>:6:16: warning: incompatible integer to pointer conversion initializing 'char *' with an expression of type 'int' [-Wint-conversion]
char* A = {'q','g','e','\0'};
^~~
<source>:6:20: warning: excess elements in scalar initializer
char* A = {'q','g','e','\0'};
Итак:
char* A = {'q','g','e','\0'};
равно:
char *A = 113;
Как q
равно 113 в соответствии с таблица ascii .
113
- недопустимый указатель.Далее в вашем коде вы делаете:
strlen(A)
, который пытается получить доступ к памяти за указателем A
.Так как указатель недействителен, то, что происходит, не определено.В вашей системе вы получаете ошибку сегментации.
Переменная A
, вероятно, должна быть преобразована в массив:
char A[] = {'q','g','e','\0'};
или, возможно, эквивалентный:
char A[] = "qge";
Который создаст массив символов и инициализирует их правильными значениями.