NULL Pointer beim Funktionsrückkehr, warum?



  • Servus, mir ist keine gescheite überschrift eingefallen 🙂

    Problem:
    Funktion1 ruft Funktion2 und übergibt nen Struktur-Pointer. Funktion2 reserviert Speicher, geht auch alles galtt, beim Rückkehr in Funktion1 ist dann aber der übergeben Pointer wieder ein NULL Pointer. Ich versteh nich ganz warum.

    die 2 Funktionen sehn folgendermassen aus:

    static void client_db_insert(TCPT_CLIENT *client, const char *nickname)
    {
    	char query[LONGSTR];
    	debug_msg("TCPT size: %d", sizeof(*client));
    	sprintf(query, "INSERT INTO clients (name, money, stamp) VALUES ('%s', '0', NOW())", nickname);
    	if (sql_query(query) != 0) {
    		debug_msg("mysql-query error");
    		return;
    	}
    
    	client = (TCPT_CLIENT*) malloc(sizeof(TCPT_CLIENT));
    	if (NULL == client) {
    		debug_msg("malloc() failed for client!");
    		bzero(client, sizeof(client));
    		return;
    	}
    
    	client->id = sql_insert_id();
    	client->money = 0;
    	client->voc = 0;
    	client->challenge_voc = 0;
    	strncpy(client->name, nickname, SHORTSTR);
    	debug_msg("client is now: ID: %d, name: %s money: %d", client->id, client->name, client->money);
    	/**
    	 * bier hier stimmt alles, SPeicher ist da & debug_msg wird korrekt ausgegeben
    	 */
    	return;
    }
    
    extern short int client_wait_connect(int *socket, TCPT_CLIENT *client)
    {
    	TCPT_COMMAND cmd;
    	char buff[MAXLINE];
    
    	for ( ; ; ) {
    		if (socket_read(*socket, buff, MAXLINE) <= 0)
    			return -1;
    
    		debug_msg("=CHILD[%d]=: data received: %s", getpid(), buff);
    		client_dispatch(client, &cmd, buff);
    		if(cmd.command == TCPT_CONNECT) {
    			debug_msg("=CHILD[%d]=: received a TCPT_CONNECT, filling client-structure", getpid());	
    
    			/**
    			 * hier wird obige Funktion aufgerufen
    			 */
    			client_db_insert(client, cmd.param);
    
    			/**
    			 * PROBLEM:
    			 * und hier ist client dann plötzlich NULL, warum?
    			 */
    			if (NULL == client) {
    				debug_msg("client is NULL");
    			}
    			return 0;		
    		}
    	}
    	return 1;
    }
    

    und noch die Struktur & Aufruf usw. was davor passiert:

    typedef struct tcpt_client {
    	unsigned short		id;							
    	int			socket;					
    	unsigned int		money;						
    	unsigned int		voc;						
    	unsigned int		challenge_voc;	
    	char			name[SHORTSTR];				
    } TCPT_CLIENT;
    
    TCPT_CLIENT *client = NULL;
    
    client_wait_connect(&socket, client);
    


  • Weil er schon vor dem Aufruf NULL war.

    Bye, TGGC (Der Held lebt!)



  • @sepl
    TGGC hat das recht kurz ausgedrückt, was der eigentliche Fehler ist.

    Du musst dir das so vorstellen:
    Du hast einen Zeiger. Dieser zeigt zunächst auf NULL bzw. 0. Nun übergibst du diesen Wert also die 0 an deine Funktion, d. h. in deinem Parameter client steht nun auch die 0. Das ist allerdings nur eine Kopie! In der Funktion änderst du den Wert der Kopie durch malloc(). Nachdem du wieder in die 1. Funktion zurückkehrst hat sich aber an dem Zeiger, den du übergeben hast, nichts verändert, da du ja auch nur eine Kopie des Zeigers übergeben hast und die Funktion nichts von dem ursprünglichem Zeiger weiß.
    Lösung des ganzen ist, dass du einen Zeiger auf einen Zeiger übergibst (also **).



  • sepL schrieb:

    /**
    	 * bier hier stimmt alles, SPeicher ist da & debug_msg wird korrekt ausgegeben
    	 */
    

    I mog a bier, na zwoa! 😃


Anmelden zum Antworten