@Nik_Set_7

Причина работы данного массива структур?

Решил освежить в памяти моменты по структурам, видимо подзабыл организацию работы массива структур.

Вопрос достаточно глупый:
Почему при объявлении в структуре массива с одним элементом, объявлении объекта, я могу записывать подобные вещи, как 24 элемент массива. В чём логика и почему не выскакивает ошибка?
Вопрос из интереса.

#include <iostream>
#include <conio.h>  

using namespace std;

struct human {                  
	short old_min;
	short old_max;
	char floor;
	char *country;
	char *sity;
	char interest[1];
};  

int main() {
	system("chcp 1251"); 

	human man[1]; // Создаём объект для работы с переменными

    man[0].old_min  = 20; 
    man[0].old_max  = 25;      
    man[0].floor	 = 'f';
    man[0].country  = "Russia";
	man[0].sity	 = "Kazan";
	strcpy(man[0].interest,"Автомобили"); ]
	strcpy(man[24].interest,"Вода Вода"); 

	cout << man[0].old_min  << endl;
	cout << man[0].old_max  << endl;
	cout << man[0].floor    << endl;
	cout << man[0].country  << endl;
	cout << man[0].sity     << endl;
	cout << man[0].interest << endl;
	cout << man[24].interest << endl;

	_getch();
	return 0;
}
  • Вопрос задан
  • 244 просмотра
Решения вопроса 1
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
А что не так? Тут вам не C#, чтоб на каждый чих эксепшены кидать, ибо на это тратится много драгоценных процессорных тактов, предполагается, что программист знает что делает и сам следит за тем, чтобы не получить доступ к чужой памяти. Если вы так ходите по стеку, то в принципе может ничего страшного и не случится(хотя всё равно не стоит), а вот с памятью, полученной через new, скорее всего программа упадёт.

en.cppreference.com/w/cpp/language/ub
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Таков смысл «си с крестами» — «вы не платите за то, чем не пользуетесь». В данном случае: не пользуетесь авариями — не платите за них. Кстати, самый эффективный способ обработки аварий на x86 только недавно лишился патента, и я не в курсе, есть ли он в MinGW (на x64 патент обошли и он там давно был). Плюс совместимость с Си.

Правда, мне пришлось сделать свои массивы Array1d и Fix1d именно для того, чтобы проверять границы: включено в debug и выключено в release.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы