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

арифметика указателей - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ DWORD не инициализируется http://www.cyberforum.ru/cpp-beginners/thread1069369.html
Пишу в Visual Studio 2008 #include "stdafx.h" #include <windows.h> #include <iostream> #include <process.h> В функции ошибка: использована неинициализированная локальная переменная "dwWaitResult" void F1(void *) { DWORD dwWaitResult; while(dwWaitResult!=WAIT_OBJECT_0)
C++ деление битов по полам Доброго времени суток. Имеется такой вопрос: как поделить инт на два инта так, чтобы в каждом из дочерних было по половине битов из начального инта, меньше, чем за 3 сдвига? Мой алгоритм такой: int a = 15161; int first_part, second_part; first_part = (a >> 16); second_part = ((a<<16)>>16); http://www.cyberforum.ru/cpp-beginners/thread1069361.html
Исправить ошибку повреждения кучи C++
Т.к. самостоятельно изучаю с++ нужна ваша помощь, а именно: пожалуйста,помогите исправить ошибку повреждения кучи и дайте советы по коду в общем( за исключением оформления по стандартам ООП) Lib.cpp #include <iostream> #include <cstring> #include <vector> #include <fstream> #include "Lib.h" using namespace std;
C++ Выведите в окно приложения прочитанную фамилию и оставшееся "время жизни" до 3000г
Помогите, пожалуйста, с решением задачи. условие: "запишите в файл фамилию и год рождения. Выведите в окно приложения прочитанную фамилию и оставшееся "время жизни" до 3000г." буду очень благодарен за решение Добавлено через 41 минуту upp
C++ Шифрование http://www.cyberforum.ru/cpp-beginners/thread1069325.html
Собственно, вопрос не совсем по си++, но нашел это место оптимальным. Так вот, речь пойдет о шифровании. А точнее: стоит ли уповать на то, что алгоритм шифрования никто не знает? Или же это как стоять под пулями в легком плащике: легко утекает сей алгоритм?
C++ Матрица m x n. Найти макс значение среди средних значений для каждой строки матрицы. Вернуть номер строки Здравствуйте. Код есть, но ведет себя не стабильно. Выводит не то, что нужно. Прошу помочь. matrix.cpp #include <iostream> #include "matrix.h" using namespace std; Matrix::Matrix(int rows, int cols){ this->rows = rows; подробнее

Показать сообщение отдельно
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 259

арифметика указателей - C++

12.01.2014, 16:03. Просмотров 327. Ответов 1
Метки (Все метки)

Здравствуйте. Объясните, пожалуйста, код из инета:
Если вы думаете, что злоключения ждут неаккуратные программы только на больших объемах данных, то я вынужден вас огорчить. Рассмотрим интересный код для работы с массивом, содержащего всего 5 элементов. Следующий пример работоспособен в 32-битном варианте и неработоспособен в 64-битной.

C++
1
2
3
4
5
6
int A = -2;
unsigned B = 1;
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
ptr = ptr + (A + B); // Некорректное значение указателя на 64-битной платформе
printf("%i\n", *ptr); // Нарушение доступа на 64-битной платформе
Давайте проследим, как происходит вычисление выражения "ptr + (a + b)":

Согласно правилам языка С++, переменная A типа int приводится к типу unsigned.
Происходит сложение A и B. В результате будет получено значение 0xFFFFFFFF типа unsigned.
Затем происходит вычисление выражения "ptr + 0xFFFFFFFFu", но что из этого выйдет, зависит от размера указателя на данной архитектуре. Если сложение будет происходить в 32-битной программе, то данное выражение будет эквивалентно "ptr - 1", и будет выведено число 3.

В 64-битной программе к указателю честным образом прибавится значение 0xFFFFFFFFu, в результате чего указатель окажется далеко за пределами массива. И при доступе к элементу по данному указателю нас ждут неприятности.

Для предотвращения показанной ситуации, как и в первом случае, рекомендую использовать в арифметике с указателями только memsize-типы. Два варианта исправления кода:

C++
1
2
3
ptr = ptr + (ptrdiff_t(A) + ptrdiff_t(B));
ptrdiff_t A = -2;
size_t B = 1;
...
C++
1
ptr = ptr + (A + B);
Вы можете возразить и предложить следующий вариант исправления:

C++
1
2
3
4
int A = -2;
int B = 1;
...
ptr = ptr + (A + B);
Да, такой код будет работать, но он плох по ряду причин
1. "переменная A типа int приводится к типу unsigned" приводится к бесзнаковому типу и остается -2? В сумме с B дает -1?
2. Здесь имеется в виду, что unsigned большей размерности, чем int? Посмотрел в инете- вроде от арх-ры зависит, может быть и 128 бит, но не уверен, хочу убедиться.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru