Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kristobald
Сообщений: n/a
#1

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

15.10.2013, 13:56. Просмотров 930. Ответов 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?

Заранее спасибо, жду комментариев. Эти вопросы ни одна книга не разбирает, было бы очень интересно разобраться!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2013, 13:56     Определение размера массива
Посмотрите здесь:

Определение размера массива + sizeof C++
C++ Определение размера одномерного массива
C++ Определение размера файла
Определение размера данных, находящихся по адресу x C++
C++ Определение размера массива
Определение размера динамического массива строк C++
C++ Определение размера char** argv
Определение размера массива в функции C++
C++ Определение размера динамического массива
C++ Определение размера строки массива строк
C++ Определение размера типа переданного в шаблон
Преобразование числа в символ и определение размера, C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
5589 / 2623 / 239
Регистрация: 01.11.2011
Сообщений: 6,448
Завершенные тесты: 1
15.10.2013, 15:36     Определение размера массива #2
Цитата Сообщение от Kristobald Посмотреть сообщение
Но как это мать его работает без ошибок???
Да очень просто. Вся суть языка это дать человеку возможность прострелить себе ногу.

Цитата Сообщение от Kristobald Посмотреть сообщение
Значит все-таки есть способ определить длину динамического объекта типа new int (10) без возни с числом 10?
Вот здесь почитайте: Создание динамического массива структур и его удаление
(ответов там правда нету, но может чего умного в голову придет)
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
16.10.2013, 00:06     Определение размера массива #3
Kristobald, посмотрите внимательно на два скриншота
Миниатюры
Определение размера массива   Определение размера массива  
Croessmah
Модератор
Эксперт CЭксперт С++
12891 / 7277 / 811
Регистрация: 27.09.2012
Сообщений: 17,976
Записей в блоге: 2
Завершенные тесты: 1
16.10.2013, 01:05     Определение размера массива #4
Цитата Сообщение от Kristobald Посмотреть сообщение
Но как это мать его работает без ошибок???
Определение размера массива
Yandex
Объявления
16.10.2013, 01:05     Определение размера массива
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru