Нестандартное применение указателей

в 9:01, , рубрики: c++, ненормальное программирование, память, указатели

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

То, о чем я хотел бы написать, возможно знакомо многим. Во всяком случае это самые основы. Но так их никто не использует. Итак, начнем.

Предисловие:

Первая моя мысль была, а что будет если я просто возьму какой-нибудь адрес 0x7fff532c1166 и попробую записать туда «1». Ну, логично предположить, что система как-то нас контролирует и выдаст ошибку сегментирования. Что и произошло.

	char *a = (char *)0x7fff532c1166;
	*a = 1;  // Ошибка сегментирования
	return 0;

Тогда возник следующий вопрос. Если я теоретически попаду в сегмент на который есть права на запись (например тело программы). Смогу ли я произвести запись? Как-то так вышло, что в Windows при запуске из Dev-Cpp, переменная при разных запусках не меняла свой адрес. Под Linux адрес постоянно менялся, поэтому проверить не получилось.

	char c;
	char *pc = (char *)0x7fff532c1166; // Заведомо известный адрес переменной c
	*pc = 1;
	printf("pc = %pn&c = %pnc =%d", pc,&c, c);
	return 0;

Все логично, все работает. Тут мы используем приведение типа. Но возник вопрос, а что если привести к неправильному типу, например, расширенному, занимающему в 2 раза больше памяти.

	unsigned char c[] = {0,0};
	unsigned short *q = (unsigned short *)c;
	*q = 0x0201; // два байта со значениями 2 и 1, если читать по отдельности
	printf("c[0] = %i nc[1] = %in", c[0], c[1]);

Для тех кто не знает, число в памяти хранится в перевернутом виде. Т.е. в данном случае сначала записано 01 потом 02. Значит c[0] получает 1, а c[1] в свою очередь 2.

Ну и такой же концепт работает в обратную сторону.

	unsigned short s = 0;
	unsigned char *q[] = {(unsigned char *)&s, (unsigned char *)(&s)+1};
	*q[0] = 2; // Первый байт 2
	*q[1] = 1; // Второй байт 1
	printf("s = %in", s);

В результате в s записано 0x0102 (опять обратная запись), это в свою очередь 256 + 2 = 258.
Прошу прощения если в чем-то ошибся, хотелось бы услышать ваше мнение. Задумывались ли вы об этом? Знали ли вы о том, что так можно делать?

Автор: Diadlo

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js