Übergabe von Arrays



  • Hi

    Ich versuche die Übergabe von Arrays zu verstehen.

    int probe(char *a);
    
    int main()
    {
    char *b = NULL;
    
      probe(b);
    
      printf("%c", b[0]);
    
    free(b);
    b = NULL;  
    
    return 0;
    }
    
    int  probe(char *a)
    {
    
    a = malloc(100);
    a[0] = 'b';
    
    return *a;
    }
    

    Wenn ich das Program compiliere + ausführe bekomme ich Segmentation fault. Sprich das Array wird wohl irgendwie nicht an die Main übergeben und daher kann der Speicher dort auch nicht befreit werden.

    Was mache ich falsch, wie funktioniert das richtig?

    mfg



  • void probe(char **a);
    
    int main()
    {
    char *b = NULL;
    
      probe(&b);
    
      printf("%c", b[0]);
    
    free(b);
    b = NULL;  
    
    return 0;
    }
    
    void probe(char **a)
    {
    
    *a = malloc(100);
    (*a)[0] = 'b';
    }
    

    So sollte es gehen. Erklärung spare ich mir im Moment. Ist schon zu spät. Vielleicht erklärts jemand nachher genauer.



  • Hi, ich habe mal dein Programm ein bisschen kommentiert.

    int probe(char *a);
    int main()
    {
    char *b = NULL;
      probe(b); // Du rufst probe auf, nimmst aber keinen Rückgabewert entgegen.
    // Der Rückabewert von probe verschwindet im Nirvana.
    // Zu schreiben wäre also b = probe(b);
      printf("%c", b[0]); // b[0] ist daher nicht definiert und es gibt nen Crash.  :D 
    free(b);
    b = NULL;  // Kannst du weglassen.
    return 0;
    }
    int  probe(char *a) // Der Parameter a ist irrelevant. Die Variable b
    // in der main Funktion bekommt davon nichts mit, weil lokal in der Funktion
    // probe eine neue Adresse erzeugt wird.
    {
    a = malloc(100);
    a[0] = 'b'; // Gefährlich ! Du weisst nicht, ob malloc erfolgreich war.
    return *a; // Hier gibst du nur den Inhalt des ersten Byte zurück, nämlich den Ascii Code von b.
    }
    

    Hier sind mal zwei Möglichkeiten, in der Praxis würde man eventuell noch ein paar Fehlermeldungen einbauen. Das habe ich mir mal geschenkt, um es so kurz wie möglich zu machen.

    #include <stdio.h>
    #include <stdlib.h>
    
    char* probe1( unsigned n ) 
    { 
    	char* a = malloc( n );
    	if( a )	// Ok, Speicherplatz n Byte bekommen.
    		a[0] = 'a'; // Eventuell else Zweig mit Fehlermeldung.
    	return a; // Kann NULL sein.
    }
    
    int probe2( char** buf, unsigned n ) 
    { 
    	*buf = malloc( n ); 
    	if( *buf ) // Ok, Speicherplatz n Byte bekommen.
    	{
    		*buf[0] = 'b';
    		return 0; // OK.
    	} 
    	else
    		return 1; // Fehler, keinen Speicherplatz bekommen. Eventuell Fehlermeldung.
    }
    
    int main() 
    { 
    	char *b = NULL; 
    	unsigned n = 100;
    
    	if( ( b = probe1( n )) == NULL )
    		return 1;
    
    	printf( "%c\n", b[0] ); 
    
    	free( b ); 
    
    	if( probe2( &b, 100 ))
    		return 1;
    
    	printf( "%c\n", b[0] ); 
    
    	free( b ); 
    
    	return 0; 
    }
    

    Gruß,
    p.



  • Danke :D. Ist gut das nun das Übergeben von Arrays funktioniert bei mir. Thx nochmal 🙂


Anmelden zum Antworten