Откудав этом массиве берётся мусор после буквы "h"?
int main() {
char arr []={'h'};
printf("%c\n", arr[1]);
return 0;
}
Буква h в бинарном коде имеет вид: 01101000
8 бит - 1 Байт, как раз такое же место выделяется под один символ.
Про добавление нуля после символа я в знаю. И про то что если массив инициализировать, то тоже мусора не будет. Интересно почему мусор в данном виде кода появляется.
C/C++
Откуда мусор в массиве? (Си)
int main() {
char arr []= { 'h' } ;
printf("%c\n", arr[0]); // <-- ноль как индекс
return 0;
}
Вы просто выходите за пределы массива. Что там за массивом - кто знает. Отсюда и "мусор".
char arr []= { 'h' } ;
printf("%c\n", arr[0]); // <-- ноль как индекс
return 0;
}
Вы просто выходите за пределы массива. Что там за массивом - кто знает. Отсюда и "мусор".
Размер вашего массива равен одному элементу типа char. Вы попытались обратится ко второму элементу в массиве и совершили выход за его пределы. В таком случае поведение программы не определено. То есть она может получить доступ к случайным данным по указанному адресу и интерпретировать их в соответствие с указанным типом либо получить отказ в доступе и в этом случае программа во время отладки сообщит об ошибке времени выполнения, связанной с повреждением памяти, а во время её выполнения преждевременно закроется по той же причине.
P.S. Размер вашего массива можно определить следующим образом:
printf("Size: %i\n", sizeof(arr) / sizeof(arr[0]));
P.S. Размер вашего массива можно определить следующим образом:
printf("Size: %i\n", sizeof(arr) / sizeof(arr[0]));
Lok-Диман -Dok
Количество бит разделили на количество элементов массива.
Я это смотрел без деления. 1 бит= 1 символ)
Я это смотрел без деления. 1 бит= 1 символ)
Lok-Диман -Dok
А если много элементов в массиве, наверное нужно делать цикл, складывать все данные и потом делить? Было бы логично.
Сейчас то просто 1/1=1
Сейчас то просто 1/1=1
Lok-Диман -Dok
Хотя, таким действием получаем количество бит в одном элементе.
Lok-Диман -Dok
*в одном элементе массива
Lok-Диман -Dok
Я помню в интернете смотрел.
Там используется что то типа такого sizeof(arr)/sizeof(char)
Нужно знать размер в битах одого символа и разделить на него общее количество бит в массиве. Получаем количество. элементов массива.
Там используется что то типа такого sizeof(arr)/sizeof(char)
Нужно знать размер в битах одого символа и разделить на него общее количество бит в массиве. Получаем количество. элементов массива.
Lok-Диман -Dok
А, ок. Первый элемент (как и любой другой элемент массива) это ведь то же самое что и тип одного элемента массива.
Но "kh fjkg" тоже мусор, а не нормальное имя +_-
Lok-Диман -Dok
Это абстракционизм)
допиши еще строчку между char arr []= { 'h' } ;
printf("%c\n", arr[1]);
unset($myArr[?]);
В том случае, если ничего не известно о ключе конкретного элемента массива, а есть данные только об его значение, в такой ситуации придется осуществлять процесс перебора всех элементов и искать тот, который необходим. К примеру, при необходимости удаления элемента массива со значением (2), код программы будет выглядеть таким образом:
$myArr = array(1,2,3,4,5);
foreach($myArr as $key => $item){
if ($item == 2){
unset($myArr[$key]);
}
}
printf("%c\n", arr[1]);
unset($myArr[?]);
В том случае, если ничего не известно о ключе конкретного элемента массива, а есть данные только об его значение, в такой ситуации придется осуществлять процесс перебора всех элементов и искать тот, который необходим. К примеру, при необходимости удаления элемента массива со значением (2), код программы будет выглядеть таким образом:
$myArr = array(1,2,3,4,5);
foreach($myArr as $key => $item){
if ($item == 2){
unset($myArr[$key]);
}
}
Lok-Диман -Dok
Какую строчку дописать? Зачем? sizeof() можно дописать чтоб убедиться что на символ выделяется 1 Байт.
Похожие вопросы
- Как узнать количество символов в UTF8 массиве?(Си)
- Strlen для int массивов.(Си)
- Указатель превращается в двумерный массив. (Си)
- Почему не правильно записывается массив?(СИ)
- Откуда взялся мусор в динамическом массиве char?
- Упорядочить элементы массива по возрастанию на языке Си
- Помогите добавить ввод чисел в массив матрицы на языке Си
- Как в функции распечатать двумерный динамический массив в Си
- Имя массива после инициализации принимает адрес в стеке, который указывает на адрес в куче? (Си)
- Одномерные массивы на языке си
Я вышел за пределы массива в соседнюю область с массивом значит.
Оператор %s тоже выходит уа пределы массива? Потому что мусор так же показывает.
int main() {
char arr []={'h'};
printf("%s\n", arr);
return 0;
}
В массиве нет индексов и теперь на месте любого элемента массива будет мусор.
Мне кажется что этот массив состоит из h и бесконечного числа элементов на месте которых мусор. Возможно есть ограничения конечно под массивы и это число не бесконечно)
В нём индексов.
printf("%s\n", arr[100]); разве вышли за пределы массива? не думаю. просто в этом элементе массива будет мусор.
Потому что arr[100] не инициализировал.
Так же например как проверить в printf не инициализированную переменную.
arr[1]='G'
Расширил. Расширяем.
А вот так не получится.
char arr [1]= { 'h' } ;
arr[1]='G'
char arr []= { 'h' } ;
arr[1]='G'
Такой вариант я много где видел. Разве так не делают?
Мапример: char arr[1]={'h'}; arr[1]='G';
Но в вашем примеренет объявления пустого массива.
Или это то же самое?
char arr[]={'h'};
Не раз видел такой вариант в уроках. А после этого именно добавление в массив чго либо.
arr[1]='G';
Могу даже ссылку на видео найти. Много в инете.
Пустой массив я имел в виду это char arr[]= { 'h' } ;
Без индексов в квадратных скобках.
Например здесь. Можно ещё поискать
char arr[]={'h'}; Здесь 1 элемент и дальше чем 1 изменять не имеем права иначе выйдем за границы массива.
Если в этом случае я вышел за пределы массива, хотите сказать что всё пространство после массива превратилось в нули?
int main() {
char arr[1]={'h'};
printf("%d\n", arr[500]);
return 0;
}