быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

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

29.09.2009, 13:33. Показов 2425. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! Вот код, в нём всё понятно.
Выводятся одинаковые значения. Но ведь этого не может быть!
Хотя бы потому не может, что по адресу, который выводится первым, должно находиться значение символа '0'!
Ну, то есть первая и третья строка вывода предсказуемы. Но вторая вообще ни в какие ворота не лезет.
Помогите разобраться, пожалуйста. Спасибо.

C++
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main () {
 char s [5]= {'0','1','2','3','4'};
 
 printf ("eto znachenie peremennoi s  %x\n", s);
 printf ("a eto eo adres! oni pochemu-to ravni    %x\n", &s  );
 printf ("a eto adres nulevogo elementa! %x\n", &s[0]  );
 getchar ();
 return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2009, 13:33
Ответы с готовыми решениями:

Чему равно значение переменной d?
int a = 5, b = 6, c = 7, d: d = (b ++- ( --c)) + (b + a--);

Почему значение переменной равно 5
Имеется код: int a= 2*2; cout &lt;&lt; a; В консоли написано, что ответ 4, а должно быть 5.

Как присвоить переменной значение, взятое по определенному адресу?
Собственно у меня есть адрес (например, 010426D8), я знаю, что под этим адресом хранится...

Поменять значение по указанному адресу в переменной типа std::string
Здравствуйте форумчане. Не получается никак правильно использовать средства С++. Задача такова:...

26
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
29.09.2009, 15:10 21
Author24 — интернет-сервис помощи студентам
#Мессир, я имел ввиду выведет значение)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,751
29.09.2009, 15:33 22
Цитата Сообщение от kravam Посмотреть сообщение
А вот как найти адрес s?
А вот, как:
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main(){
    char s1[] = "abcd";
    char s2[] = "abcd";
    char *s3 = s1;
    
    printf("%tx\t%tx\t%tx\n", s1, s2, s3);
    
    return 0;
}
0
Псевдо программист
192 / 113 / 37
Регистрация: 19.09.2009
Сообщений: 303
29.09.2009, 15:51 23
Не то.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
29.09.2009, 16:04  [ТС] 24
Цитата Сообщение от #Мессир Посмотреть сообщение
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
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
29.09.2009, 20:38 25
Позвольте слегка вставить свои 5 копеек. Тут наблюдается путаница между понятиями значения и адреса. Переменная s не "виртуальная", это просто массив. Формально значением такой переменной является содержимое всего массива. Но массивы в Си и С++ не имеют традиционной семантики значения: нельзя присвоить один массив другому, передать его значение в функцию через стек и т.п. Семантика массивов тесно переплетена с семантикой указателей, так что значение переменной-массива при любом удобном случае деградирует (pointer decay) до указателя на первый элемент массива. Это происходит, в частности, при передаче этого значения в printf.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.09.2009, 05:26 26
Цитата Сообщение от kravam
В моём случае s (та самая вышеупомянутая переменная типа массив)
тип массив преобразуется в тип указатель на элемент того же типа, что и массив

C
1
    printf ("eto znachenie peremennoi s  %x\n", s);
так как s - имя массива, то оно преобразуется в указатель на нулевой элемент и только потом подаётся в функцию printf
0
62 / 63 / 3
Регистрация: 25.05.2009
Сообщений: 520
30.09.2009, 06:36 27
Цитата Сообщение от kravam Посмотреть сообщение
C++
1
2
3
 char s [5]= {'0','1','2','3','4'};
 
 printf ("eto znachenie peremennoi s  %x\n", s);
По-моему, вся проблема в том, что переменной s в чистом виде у тебя не сущществует.
Есть только лишь массив s[x].
И, теоретически, компилятор должен был заругаться на обращение к s.
А он оказался умничкой, и сам сообразил, что s это и есть &s.
0
30.09.2009, 06:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2009, 06:36
Помогаю со студенческими работами здесь

Нюансы использования препроцессора и макросов: чему будет равно значение переменной a?
Чему будет равно значение переменной a? #define square(x) (x * x) int b = square(2.5); int a =...

Чему будет равно значение переменной s после выполнения следующего фрагмента программы
Очень прошу помогите решить!!!! 1) Чему будет равно значение переменной s после выполнения...

Чему будет равно значение переменной z после выполнения следующего фрагмента программы?
Пожалуйста, очень прошу помогите с тестами(( 1)Чему будет равно значение переменной z после...

Как я могу проверить равно ли значение переменной char одному из указанных значений?
Как я могу проверить равно ли значение переменной char одному из указанных значений? На примере...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru