Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Kristobald

Определение размера массива

15.10.2013, 13:56. Показов 2848. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем у меня несколько вопросов по языку си (компилятор gcc).

1) Есть, например след код:

C
1
2
3
4
5
6
7
char* sym;
char c = 'a';
sym = &c;
*++sym = 'b';
*++sym = '\0';
sym -= 2;
printf ("sym = %s", sym);
Я понимаю, что это извращения, но все же. Здесь как видно, создается указатель на char, далее инициализируется адресом переменной, затем последовательно указатель сдвигается на байт и в ячейку памяти с адресом указателя кладется литерал. Но как это мать его работает без ошибок??? Ведь память выделена только под один символ, а программа пытается записать что-то в неадресованную область памяти! Более того, если мы уберем из программы, пару строчек

C
1
2
3
4
5
6
char* sym;
*sym = 'a';
*++sym = 'b';
*++sym = '\0';
sym -= 2;
printf ("sym = %s", sym);
то она откажется работать, понятно почему, я бы сказал естественно. Ну а в предыдущем примере как так происходит, что не вылетает Segmentation fault (core dumped).

2) Практически та же программа (только чуть модифицированная). Откажемся от правила завершать строку '\0'
C
1
2
3
4
5
6
7
8
9
10
char* sym;
char c = 'a';
sym = &c;
*++sym = 'b';
*++sym = 'c';
*++sym = 'd';
*++sym = 'z';
*++sym = 'x';
sym -= 5;
printf ("sym = %s", sym);
У меня вопрос как printf смог определить размер строки которую надо напечатать, несмотря на то, что символ '\0' в конце не установлен? sizeof здесь не помогает (вернет 4) тогда как??? Значит все-таки есть способ определить длину динамического объекта типа new int (10) без возни с числом 10?

Заранее спасибо, жду комментариев. Эти вопросы ни одна книга не разбирает, было бы очень интересно разобраться!
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.10.2013, 13:56
Ответы с готовыми решениями:

Определение размера массива
Код: template <class T,int N> int arr_sz(T (&arr)) {return N;} void sum(int a){cout<<a;}; int main() {

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

Определение размера массива + sizeof
Массив из 6 чисел: sizeof возвращает 24 байта. Тот же массив вызван функцией возвращает только 4 байта. #include <iostream> ...

3
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
15.10.2013, 15:36
Цитата Сообщение от Kristobald Посмотреть сообщение
Но как это мать его работает без ошибок???
Да очень просто. Вся суть языка это дать человеку возможность прострелить себе ногу.

Цитата Сообщение от Kristobald Посмотреть сообщение
Значит все-таки есть способ определить длину динамического объекта типа new int (10) без возни с числом 10?
Вот здесь почитайте: Создание динамического массива структур и его удаление
(ответов там правда нету, но может чего умного в голову придет)
0
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
16.10.2013, 00:06
Kristobald, посмотрите внимательно на два скриншота
Миниатюры
Определение размера массива   Определение размера массива  
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
16.10.2013, 01:05
Цитата Сообщение от Kristobald Посмотреть сообщение
Но как это мать его работает без ошибок???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.10.2013, 01:05
Помогаю со студенческими работами здесь

Определение размера одномерного массива
Добрый день. Необходимо задать размер одномерного массива. В цикле for стоит переменная - счетчик, которая увеличивается на единицу при...

Определение размера массива в функции
Всем доброго дня ! Подскажите пожалуйста, как можно определить размер массива в функции ? запись int n = sizeof(a)/sizeof(int);...

Определение размера динамического массива строк
Здравствуйте, столкнулся с проблемой предопределения размера массива строк. Проблема в том, что я не знаю, какой размер мне выделить при...

Определение размера строки массива строк
Здравствуйте! Visual C++ char *my_string={"Это первая строка", "Это вторая строка", "Это третья...

Определение размера файла
Здравствуйте, я учусь на программиста, нужна помощь в программе. #include <fstream.h> #include <windows.h> #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru