2015-02-14 1 views
0

Код:C++ указатель и массив Основы

#include <iostream> 
using namespace std; 

int main(int argc, const char * argv[]) { 
    char testChar[] = {'a','b','c'}; 
    char *testPointer = testChar ; 
    cout << testPointer << endl; 
    return 0; 
} 

Вопрос:

Когда я использую cout << mypointer,

  1. Почему печатать каждую букву массива и беспорядок (см выход) в конце? Мое предположение - когда я вижу указатель указывает на первые буквы, затем второй и т. Д. И печатает материал в конце.
  2. Что такое беспорядок (см. Вывод) в конце, адрес?

Комментарии:

  • Я знаю, что в конце массива там предполагают, чтобы быть пустой указатель права?
  • Я узнал об этом год назад и забыл, пожалуйста, помогите мне вспомнить, что происходит.

Выход:

abc 310 367 277_ 377 
Program ended with exit code: 0 

ответ

4

При выводя строки (или массив символов в вашем случае), то она должна заканчиваться нулевым символом \0, в противном случае cout будет продолжать печатать символы, расположенные в памяти мимо намеченной строки до тех пор, пока она не попадет в нуль-символ или не обратится к памяти, которую не разрешено читать, из которой возникает ошибка сегментации.

Этот «беспорядок» в конце, который печатается, - это значения, расположенные в ячейках памяти, непосредственно за массивом символов.

+1

Точно .. если вы использовали printf == printf ("% s \ n", testPointer); ==, чтобы напечатать строку, вы увидите точно такие же результаты, что показывает, что она не связана с самим cout, а с тем, как была сформирована строка. – Alberto

+1

Вы можете предпочесть инициализировать строки следующим образом: 'char testChar [] =" abc ";'. Это автоматически добавит нулевой ограничитель в конце строки. Если вы просмотрите результаты 'cout << sizeof (testChar);', вы увидите, что на самом деле выделено 4 байта памяти: 3 символа плюс нулевой терминатор. – eigenchris

0

Также после инициализации char testChar[] = "abc"; вам действительно не нужен оператор 'char * testPointer = testChar', поскольку testChar сам является адресом для первого элемента массива. Так cout << testChar << endl; будет делать.