Gültigkeitsbereich eines char **-zeigers



  • Hallo!

    Ich bin neu in diesem Forum, habe aber an sich schon ein wenig an von C. Beim Programmieren habe ich jetzt folgendes Problem:

    Ich möchte einen zweidimensionalen char array in einer Unterfunktion definieren (also einen eindimensionalen Stringarray). Sobald ich aber wieder in der Main-Funktion bin, kann ich nicht mehr auf die einzelnen strings zugreifen... Hat die Speicherreservierung nur eine begrenzte Gültigkeit oder woran liegt das? Die einzelnen Adressen der Strings bekomme ich noch...

    Untenstehend ist ein formal ähnlicher Code abgebildet, der auch die gleichen Probleme aufweist.

    Vielen Dank schon mal!

    #include<stdio.h>
    #include<stdlib.h>
    
    int fill(char ** buffer);
    
    int main()
    {
    	int i,j;
    
    	char ** buffer;
    
    	fill(buffer);
    
    	for(i=0;i<5;i++)
    		printf("%s\n",buffer[i]);
    
    	return 0;
    
    }
    
    int fill(char ** buffer)
    {
    	int i,j;
    
    	buffer=(char**)malloc(5*sizeof(char*));
    
    	for(i=0;i<5;i++)
    		buffer[i]=(char*)malloc(10*sizeof(char));
    
    	for(i=0;i<5;i++)
    		for(j=0;j<9;j++)
    		{	
    			buffer[i][j]='K';
    			buffer[i][j+1]='\0';
    		}
    
            for(i=0;i<5;i++)
    		printf("%s\n",buffer[i]);
    
            return 0;
    }
    


  • Die übergebenen Parameter sind innerhalb der Funktion immer nur eine Kopie. Deswegen ändert sich am Wert von buffer auch durch den Aufruf von fill nichts. Prinzipiell bieten sich zur Lösung des "Problems" zwei Dinge an:

    // a) Rückgabe des Zeigers
    char ** fill( /*whatever*/ );
    
    // ...
    
    char **foo = fill( /*whatever*/ );
    
    // b) Übergabe eines Zeigers auf den Zeiger
    /*whatever*/ fill(char ***);
    
    // ...
    char **foo;
    fill(&foo);
    

    Da bei dir ein int zurückgegeben werden soll, bietet sich b) an.
    (Auch wenn ich eine Aversion gegen drei Sternchen habe ;))

    PS: malloc() muss nicht gecastet werden und sizeof(char) ist immer 1.



  • Vor allem finde ich schlecht, wenn Speicher für ein mehrdimensionales Array reserviert werden soll, malloc mehrfach aufzurufen und dann das Ganze
    auch noch in n'er for-Schleife.
    Ein Aufruf von malloc() reicht immer aus!

    #include<stdio.h> 
    #include<stdlib.h> 
    
    typedef char(*ptr)[10];
    
    int fill(ptr *); 
    
    int main() 
    { 
        int i; 
        ptr buf; 
    
        fill(&buf); 
    
        for (i = 0; i < 5; i++) 
            printf("%s\n", &buf[i][0]); 
    
        return 0; 
    } 
    
    int fill(ptr * buffer) 
    { 
        int i,j; 
    
        *buffer=(ptr)malloc(5*10*sizeof(char)); 
    
        for (i=0; i < 5; i++)
        {
            for (j=0; j < 9; j++) 
               (*buffer)[i][j] = 'K'; 
    
            (*buffer)[i][j]= '\0';
        }    
        for (i=0; i < 5; i++) 
            printf("%s\n", &(*buffer)[i][0]); 
    
            return 0; 
    }
    

    mfg



  • balduin schrieb:

    Ein Aufruf von malloc() reicht immer aus!

    Einfach mal lesen: http://www.c-faq.com/aryptr/dynmuldimary.html



  • So, diesmal habe ich es auch geschafft mich einzuloggen. Vielen Dank für den Tip, ich habe das einfach nicht mehr gesehen...
    Und zum Thema zweidimensionale Arrays reservieren: Ich mach das lieber weiterhin mit einer for-Schleife, so kritisch ist die Rechenzeit nicht und ich muss weniger Hirnverenkungen (sprich: weniger Fehler) machen.



  • solar_simon schrieb:

    Und zum Thema zweidimensionale Arrays reservieren: Ich mach das lieber weiterhin mit einer for-Schleife, so kritisch ist die Rechenzeit nicht und ich muss weniger Hirnverenkungen (sprich: weniger Fehler) machen.

    Und das ist auch die richtige Vorgehensweise 👍


Anmelden zum Antworten