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

Парадокс: значение переменной равно её адресу - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Система двух линейных уравнений http://www.cyberforum.ru/cpp-beginners/thread53083.html
Задача на решение системы, состоящей из двух линейных уравнений, по формуле Крамера. Т.е. через определитель вотрого порядка. #include <iostream> #include <conio.h> using namespace std; int...
C++ Умножение матриц Решенная задача на умножение матриц для сборника. Матрицы вводятся с клавиатуры построчно. #include <iostream> #include <conio.h> using namespace std; void matrix_output(int ** MATRIX, int... http://www.cyberforum.ru/cpp-beginners/thread53080.html
Вычислить сумму первых N элементов ряда C++
Помогите пожалуйста решить такую задачу: Вычислить сумму первых N элементов ряда:X-X^2/2+X^3/3-X^4/4+X^5/5..... . Вычисление проводить до тех пор пока модуль очередного элемента больше...
Объявление функции C++
Всем доброго времени суток! Подскажите пожалуйста, как правильно объявить функцию, которая возвращает указатель на двумерный массив. И какое именно значение будет возвращать эта функция?
C++ Поменять местами первую и последнюю цифры числа http://www.cyberforum.ru/cpp-beginners/thread53068.html
Поменять местами первую и последнюю цифры числа. Помогите пожалуйста, а то с C++ вообще никогда не приходилось работать :(
C++ Небольшая помощь Ктото может написать небольшой модуль которий будет считивать какуюта інформацию с файла *тхт каждих 2 сек ?? спс подробнее

Показать сообщение отдельно
kravam
быдлокодер
1696 / 883 / 45
Регистрация: 04.06.2008
Сообщений: 5,474
29.09.2009, 16:04  [ТС]
Цитата Сообщение от #Мессир Посмотреть сообщение
kravam, а ты дизассемблером его.... и посмотри сократи код до 3х строк, чтобы было проще разобраться. Просто мне сейчас некогда заниматься этим. Работа
Не так просто, это же не асемблерный код. Одно дело бряки на функции ставить, другое дело отслеживать переменные, не видя их имён. Но я попробовал.
Вот код, я его запустил в OllyDbg

C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main () {
 void* uk_1;
 void* uk_2;
 char s [5]= {'0','1','2','3','4'};
 printf ("&s[1]= %x",&s[1]);
 uk_1= s; 
 uk_2= &s;
 return 0;
}
Поставил бряк на выполнение printf. И вот такой наблюдаю код

004012DD |. E8 4E050000 CALL <JMP.&msvcrt.printf> ; \printf
004012E2 |. 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
004012E5 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX
004012E8 |. 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
004012EB |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX

Вот после выполнения printf (первая строка) по РАЗНЫМ адресам [EBP-C] и [EBP-10] кладётся одно и то же значение. (EAX)
Я посмотрел, что это за значение. Это адрес. и по нему находится этот самый массив. То есть адрес этого массива кладётся два раза по разным адресам.
Остаётся предположить, что это выполняются две такие инструкции:

C++
1
2
 uk_1= s; 
 uk_2= &s;
В общем, поняно всё. Переменная s, как я уже говорил- двояка и виртуальна (не имеет собсвенного адреса). В первом случае это адрес нулевого элемента, во втором- адрес всего массива (автоматически опять же нулевого элемента.) Всем спасибо.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru