funktion die das dest. array dynamisch erweitert. Aber es will nicht :(



  • Hallo Bin noch Anfänger und verstehe nicht warum meine kleine ^erweiterung^ für C nicht funktioniert. Bei Ausstritt aus der Init Funktion ist der pointer ungültig! Warum?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int InitAddStrToDynMem(char *ptrdynmem);
    int AddStrToDynMem(char *ptrdynmem ,char *srcstr);
    void FreeAddStrToDynMem(char *ptrdynmem);
    
    int main(void)
    {
    	char *memptr = NULL;
    
    	InitAddStrToDynMem(memptr);
    
    	AddStrToDynMem(memptr ,"HALLO");
    
    	printf("%s",memptr);
    
    	FreeAddStrToDynMem(memptr);
    
    	return 0;
    }
    
    int InitAddStrToDynMem(char *ptrdynmem)
    {
    
    	ptrdynmem = (char *) calloc(1 ,sizeof(char));
    	if(ptrdynmem == NULL)
    		return 0;
    
    	return 1;
    }
    
    int AddStrToDynMem(char *ptrdynmem ,char *srcstr)
    {
    	size_t currentlen = 0 ,srcstrlen = 0;
    
    	currentlen = strlen(ptrdynmem);
    	srcstrlen  = strlen(srcstr);
    
    	ptrdynmem = (char *) realloc(ptrdynmem ,srcstrlen);
    	if(ptrdynmem == NULL)
    		return 0;
    
    	memcpy(&ptrdynmem[currentlen] ,srcstr ,srcstrlen);
    	*(ptrdynmem + (currentlen + srcstrlen)) = 0;
    
    	return 1;
    }
    
    void FreeAddStrToDynMem(char *ptrdynmem)
    {
    
    	free(ptrdynmem);
    	return;
    }
    


  • Weil die Funktionsparamter in der Funktion lokal sind.

    Wenn du einen nichtlokalen Wert aus einer Funktion heraus ändern willst, musst du (in C) die Adresse davon übergeben.
    Du willst hier einen Pointer ändern und darum musst du auch die Adresse von dem Pointer übergeben. )In der Funktion musst du dann aber auch mit dieser Adresse arbeiten)

    Oder du nutzt den Rückgabewert einer Funktion aus.



  • Bsp?
    Verstehe dich leider nicht ganz.



  • Beispiel:

    #include <stdlib.h>
    #include <stdio.h>
    void f(int *a)
    {
    	static int p = 1;
    	a = &p;
    	printf("%d\n", *a);
    }
    int main(void)
    {
    	int c = 5;
    	int *b = &c;
    	printf("%d\n", *b);
    	f(b);
    	printf("%d\n", *b);
    	return EXIT_SUCCESS;
    }
    

    deine frage hierzu währe jetzt: Warum zeigt denn b am ende nicht auf p



  • Versteh dein Beispiel aber die frage bleibt! Wie könnte den die Funktion aussehen das am Ende b auf p zeigt?



  • OK, einfachere Aufgabe.

    void f(int a)
    {
        a = 5;
        printf("%d", a); // Ausgabe 5
    }
    
    int main()
    {
        int a = 0;
        printf("%d", a); // Ausgabe 0
        f(a);
        printf("%d", a); // Ausgabe 0
    }
    

    Wieso ist a am Ende nicht 5? Es wird doch in f() verändert?



  • anfaenger123 schrieb:

    Versteh dein Beispiel aber die frage bleibt!

    Na, anscheinend nicht ganz, wenn die Frage bleibt.
    In deiner Funktion InitAddStrToDynMem erstellst du mit calloc einen Speicherbereich und bekommst dessen Adresse zurück, welche du als Wert des Zeigers ptrdynmem speicherst. Damit überschreibst du ptrdynmem, welcher zuvor als Wert NULL von memptr hatte. Da bei Aufruf von InitAddStrToDynMem lediglich der Wert memptr auf ptrdynmem kopiert wurde, hat sich an memptr gar nichts geändert.

    Zum Ändern eines Wertes ausserhalb der Funktion sollte diese dessen Adresse bekommen und darüber den Speicherbereich, auf den die Adresse verweist, verändern. Dies gilt auch, wenn der Speicherbereich ein Pointer ist, welcher eine Adresse enthält.



  • Na so:

    #include <stdlib.h>
    #include <stdio.h>
    void f(int **a) //zeiger auf zeiger auf int
    {
    	static int p = 1;
    	*a = &p;
    	printf("%d\n", **a);
    }
    int main(void)
    {
    	int c = 5;
    	int *b = &c;
    	printf("%d\n", *b);
    	f(&b);
    	printf("%d\n", *b);
    	return EXIT_SUCCESS;
    }
    

    denn du willst ja den wert des Zeigers ändern und nicht den wert von dem auf das der Zeiger zeigt



  • Ey, jetzt macht ihr meine pädagogisch wertvolle Herangehensweise kaputt. 😞



  • Jetz gehts

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int InitAddStrToDynMem(char **ptrdynmem);
    int AddStrToDynMem(char **ptrdynmem ,const char *srcstr);
    void FreeAddStrToDynMem(char **ptrdynmem);
    
    int main(void)
    {
    	char *memptr = NULL;
    	char str[] = {"hey"};
    
    	InitAddStrToDynMem(&memptr);
    
    	AddStrToDynMem(&memptr ,"HALLO");
    	AddStrToDynMem(&memptr ,"12345");
    	AddStrToDynMem(&memptr ,"67890");
    	AddStrToDynMem(&memptr ,str);
    
    	printf("%s",memptr);
    
    	FreeAddStrToDynMem(&memptr);
    
    	getchar();
    
    	return 0;
    }
    
    int InitAddStrToDynMem(char **ptrdynmem)
    {
    
    	*ptrdynmem = (char *) calloc(1 ,sizeof(char));
    	if(*ptrdynmem == NULL)
    		return 0;
    
    	return 1;
    }
    
    int AddStrToDynMem(char **ptrdynmem ,const char *srcstr)
    {
    	size_t currentlen = 0 ,srcstrlen = 0;
    
    	currentlen = strlen(*ptrdynmem);
    	srcstrlen  = strlen(srcstr);
    
    	*ptrdynmem = (char *) realloc(*ptrdynmem ,currentlen+srcstrlen+1);
    	if(*ptrdynmem == NULL)
    		return 0;
    
    	memcpy(*ptrdynmem+currentlen ,srcstr ,srcstrlen+1);
    
    	return 1;
    }
    
    void FreeAddStrToDynMem(char **ptrdynmem)
    {
    	free(*ptrdynmem);
    	return;
    }
    


  • ...



  • Ja ich weiss bei C ist das nicht notwendig. Oder?



  • ...



  • Wäre es falsch und wen was wären die Probleme die es geben würde... möchte nicht auf den Pointer gehen möchte es nur Verstehen.



  • ...


Anmelden zum Antworten