2016-03-28 6 views
0

У меня есть некоторые проблемы с отображением данных из нескольких указателей.Проблемы с указателями

int main() 
{ 
    char *arr = new char(); 
    for (int t = 0;t < 10;t++) 
    { 
     int size = Generator::GetInstance()->Generate(arr); 
     for (int generateChars = 0;generateChars < size;generateChars++) 
     { 
      std::cout << &arr[generateChars] << " "; 
     } 
     std::cout << std::endl; 
    } 
    return 0; 
} 

и класс Генератор

int Generator::Generate(char *ar) 
{ 
    srand(time(NULL)); 
    int size = (rand() % 10)+1; 
    arr = new char[size]; 
    for (int t = 0;t < size;t++) 
    { 
     int path = rand() % 4; 
     switch (path) 
     { 
      case 0: 
       arr[t] = 'U'; 
       break; 
      case 1: 
       arr[t] = 'R'; 
       break; 
      case 2: 
       arr[t] = 'D'; 
       break; 
      case 3: 
       arr[t] = 'L'; 
       break; 
     } 
    } 
    arr[size] = '\0'; 
    *ar = *arr; 
    return size; 
} 

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

+0

Вы случайно пришли из фона Java? – Maxpm

+3

Вы выделяете 'arr' в main, а затем снова в' Generate', это вызовет проблемы. –

+1

Функция «Генерировать» отвечает за выделение памяти. Поэтому нет необходимости делать это в 'main':' char * arr = new char(); 'Кроме того, ваша функция' Generate' не может абсолютно ничего с этим указателем, чтобы изменить его, поскольку вы передали указатель по значению. – PaulMcKenzie

ответ

1

Поменяйте свой «Generate» параметр функции от указателя на указатель ссылки:

int Generator::Generate(char *& ar) 

и изменить строку:

*ar = *arr; 

, который находится в y наша функция «Создать», чтобы:

ar = arr; 

запомнить Также очистить любую динамическую память, которая «ар» может указывать на, когда «Генерировать» называется.

Я тестировал этот код и он работал для меня ...

EDIT В "для" цикла, который отображает ваш массив, измените строку:

std::cout << &arr[generateChars] << " "; 

к:

std::cout << arr[generateChars] << " "; 
+0

Спасибо. Помогли довольно много. – user3710529

+0

Нет, проблема. Я рад быть полезным. :) – Fearnbuster

+0

Еще одна вещь, удалите оператор «address of» (&) из строки, которая отображает массив символов: 'std :: cout << & arr [generateChars] <<" ";' – Fearnbuster

3

Если вы попытаетесь напечатать char *, C++ предполагает, что это строка с нулевым символом в стиле C.

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

Простое решение передать либо char или char &, вместо char *, так что I/O будет правильно интерпретировать его как один символ.

Однако это не устранит утечки памяти, которые являются отдельной проблемой. Если вы хотите использовать C++ для чего-либо, кроме игрушечных программ, вы должны сделать привычку delete -всю что-либо выделенное new, когда вам это больше не нужно.

Наконец, как указано в комментариях, ваш код очень неидиоматичен для C++. На самом деле очень сложно учиться с низкоуровневым кодом вроде этого, но в стандартной библиотеке есть std::string и всевозможные контейнеры, которые упрощают управление вашей памятью правильно, поэтому убедитесь, что вы научились их использовать, так как а также понимание особенностей нижнего уровня они построены на ...

Смежные вопросы