2015-08-17 2 views
0

Я играю с программированием сокетов на Qt. Я читаю массив символов из сокета сервера как клиентский сокет и возвращаю результат в качестве указателя char.Как преобразовать указатель char, возвращенный из функции в строку?

char* zgr_socket::sendMessage(){ 
    char buffer[5]; 
     while(1){ 
      bzero(buffer,2); 
      n = read(sockfd,buffer,2); 
      if (n < 0){ } 

      close(sockfd); 
      return buffer; 
     } 
} 

И я стараюсь, чтобы получить результирующий массив символов из в этом методе

void MainWindow::on_pushButton_2_clicked() 
{ 
    char* returnedChar = mySocket->sendMessage(); 


    std::string aString(returnedChar); 
    QString myQString = QString::fromStdString(aString); 

    ui->label1->setText(myQString); 
} 

Независимо от того, что я пытался, я не мог управлять, чтобы получить правильный массив символов. Когда я отлаживаю взгляд на строку return buffer, он возвращает правильный массив, но после какой-то магии я получаю произвольные значения в переменной aString. Может ли кто-нибудь увидеть причину, пожалуйста?

+5

@AndyG That frickng буфера локальной переменный и возвращаемого значение зависшего ponter –

+0

@ DieterLücking Этого комментария является правильный ответ и заставил меня смеяться. Спасибо. – ozgur

+0

Выполнение программирования сокетов при использовании чисто C apis - это верный способ причинить себе вред. Я предполагаю, что вы делаете это по какой-то определенной причине, потому что, если все, что вам нужно, это подтолкнуть некоторые данные по сети, Qt обеспечивает все это простым в использовании способом. Весь смысл Qt - сделать вашу жизнь проще. По крайней мере, попробуйте использовать контейнеры C++ для перемещения ваших данных, например, 'QByteArray' или' std :: vector '. Таким образом, вы менее склонны умирать от сильной смерти C, и вы не будете иметь дело с совершенно ненужным ручным управлением памятью. –

ответ

2

Вы возвращаете указатель на char buffer[5];, за исключением того, что буфер является локальной переменной функции, поэтому после выхода функции она перестает существовать. Теперь у вас свисающий указатель. Попробуйте вернуть string из функции вместо char* и просто создайте строку как часть оператора return.

+1

Спасибо. Это была проблема. Я получу ответ за 7 минут. – ozgur

-1

Существует QString конструктор, который принимает обугленный указатель в качестве параметра:

QString::QString(const char * str) 

see more

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