2017-11-30 1 views
0

Ich habe einen Strukturzeiger auf eine Funktion übergeben. Was ich brauche, ist die Zeichenfolge "Verbindung verweigert" (Rückgabe von ssh_get_error()) in der Hauptfunktion.Wie bekomme ich den Wert von Char Zeiger Mitglied einer Struktur in einer anderen Funktion

#include <libssh/libssh.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <iostream> 
#include <cstring> 

using namespace std; 

typedef struct rtns { 
    bool state; 
    char* desc; 
} rtns; 

int connect_host(rtns *con_host) { 
    const char* desc; 
    char desc2[1000]; 
    ssh_session my_ssh_session; 
    int rc; 
    my_ssh_session = ssh_new(); 
    if (my_ssh_session == NULL) 
     exit(-1); 
    ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, "localhost"); 
    rc = ssh_connect(my_ssh_session); 
    if (rc != SSH_OK) { 
     (*con_host).state = false; 
     desc = ssh_get_error(my_ssh_session); 
     strcpy(desc2, ssh_get_error(my_ssh_session)); 
     (*con_host).desc = strdup(desc2); 
     cout << "from connect_host function->" <<con_host->desc << "\n"; 
    } else { 
     (*con_host).state = true; 
    } 

    ssh_disconnect(my_ssh_session); 
    ssh_free(my_ssh_session); 
} 

int main() { 
    rtns con_host; 
    rtns *p = (rtns*) malloc(sizeof(struct rtns)); 
    p = (rtns*) malloc(20); 
    connect_host(&con_host); 
    cout << "from main function->" << *(con_host.desc) << "\n\n"; 
} 

Output-

from connect_host function->Connection refused 
from main function->C 

Das Problem ist, dass ich nur in der Hauptfunktion ein Zeichen "C" immer bin. Ich habe eine Idee, dass ich Speicherzuweisung falsch mache, aber ich habe keine Idee, wie man es richtig macht. Ich habe auch versucht, die malloc-Zuweisung in der con_host-Funktion zu verschieben, aber es hat auch nicht funktioniert.

Antwort

0

Denken Sie darüber nach, was Sie drucken. Sie passieren in den Stream ein char, kein char *:

cout << "from main function->" << con_host.desc << "\n\n"; 

Here is a live example.

+0

So dass Malloc Teil nicht einmal notwendig ist? Ich führe es erneut und es funktioniert ohne es. Aber ich fand im Internet, dass der Zeichenzeiger in einer Struktur zuerst Speicher zugewiesen werden musste. Kannst du bitte Erklären? –

+0

@RishabhSoni Sie * do * zuweisen Sie etwas Speicher. Lesen Sie über [strdup] (http://en.cppreference.com/w/c/experimental/dynamic/strdup). Es wird den Speicher der Zeichenfolge für Sie erstellen, in der Tat müssen Sie später kostenlos darauf zugreifen, um die Zeichenfolge zu löschen. –

0

Es ist nicht:

cout << "from main function->" << *(con_host.desc) << "\n\n"; 
// *(con_host.desc) = *(char *) = char 
// Above is a simplification but you get the point. 

Solange con_host.desc eine Null c Zeichenfolge beendet Sie es wie folgt drucken Speicherzuordnungsfehler. Es wird durch die Ausgabeanweisung verursacht. Ändern Sie zu

 cout << "from main function->" << con_host.desc << "\n\n"; 
Verwandte Themen