странный консольный вывод - PullRequest
1 голос
/ 04 марта 2012

Для школьного проекта мы должны работать с указателями, для этого я хотел увидеть адреса памяти, но ... Когда я использую следующий кусок кода:

int _tmain(int argc, _TCHAR* argv[]){
  char a;
  char b;
  char * pa;
  char * pb;
  pa = &a;
  pb = &b;

  cout << "adress pa "<< pa <<endl;
  cout << "adress pb "<< pb <<endl;

  cout << "a is  " << a << endl;
  cout << "b is  " << b << endl;

я получаю это как вывод: enter image description here

Это проблема набора символов, и самое главное, могу ли я исправить это?

Я протестировал другой кусок кода:

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{int x = 25;
int * p;
p = &x;
cout << "adres" << p << endl;
*p = 10;
cout << "x"<< x << endl;
cin.get();

    return 0;
}

и вывод читабелен: enter image description here

Чем отличается?

1 Ответ

6 голосов
/ 04 марта 2012

Это потому, что вы разыменовываете неинициализированные указатели. Это неопределенное поведение.

Одна из перегрузок оператора << в стандартной библиотеке C ++ интерпретирует char* как строку C, а не как указатель. Если ваша строка C не инициализирована, оператор << печатает ненужные файлы. Для int* подобной перегрузки не существует, которая интерпретировала бы ее как что-либо, кроме указателя, поэтому во втором случае вы видите правильное поведение.

Если вы не хотите, чтобы указатель char* интерпретировался как строка C, приведите указатель к void*.

cout << hex << static_cast<void*>(pa) << endl;

(hex позволяет отображать указатель с использованием более обычной записи base-16).

...