chronische Pointersenilitaet bei Parameteruebergabe
-
Hallo,
...wiedermal Pointer Uebergabe:Ich will einen Pointer (pResult) einer Funktion A per Parameter (reference) uebergeben an eine Funktion B und dann das Resultat in A wieder zur Verfuegung haben. Ich will keinen neuen Speicher allokieren, sondern das der uebergebene Pointer einfach nur auf den entsprechenden Bereich zeigt.
Irgendwie geht das nicht, der Pointer alzheimert.. - warum?
Bsp:
#include <stdlib.h> #include <stdio.h> #include <string.h> #define TEXT1 "blabla cdf asdf asdf foo bar\n" int callMemchr(char* pText, char* pPattern, const unsigned int TEXT_SIZE, char* pTarget) { // init if(pText == NULL) return -1; if(pPattern == NULL) return -1; pTarget = NULL; // set pTarget on the first occurance of pPattern in pText or return -1 pTarget = (char*)memchr(pText, *pPattern, TEXT_SIZE); // void* has to be casted to char*, passing the content, due to function call! printf("pTarget: \"%s\"\n", pTarget); // pTarget hier zeigt das richtige Ergebnis an! if( pTarget == NULL) return -1; return 0; }; int main(int argc, char** argv) { // init printf("Memfoo() - init\n\n"); char* text1 = NULL; if( (text1 = malloc(sizeof(char) * (strlen(TEXT1) + 1))) == NULL) return -1; strcpy(text1, TEXT1); const unsigned int TEXT1_SIZE = (strlen(text1) + 1); char character = 'c'; char* pResult = NULL; if( 0 == callMemchr(text1, &character, TEXT1_SIZE, pResult)) printf("String:\n%s \ncontains \"%c\"?\nResult: \"%s\"\n", text1, character, pResult); // pResult hier ist immer leer??!!! return EXIT_SUCCESS; };
-
wenn du den Inhalt eines Zeigers in einer anderen Funktion ändern willst, dann musst du den Zeiger als Zeiger übergeben. Es ist das gleiche wie bei normalen Variablen. In callMemchr veränderst du nur die Kopie des Zeigers 'pResult', deswegen sind Änderungen nur in callMemchr sichtbar.
int callMemchr(char* pText, char* pPattern, const unsigned int TEXT_SIZE, char** pTarget) { ... *pTarget = memchr(pText, *pPattern, TEXT_SIZE); printf("pTarget: \"%s\"\n", *pTarget); // pTarget hier zeigt das richtige Ergebnis an! if( *pTarget == NULL) return -1; return 0; } int main(int argc, char** argv) { if( 0 == callMemchr(text1, &character, TEXT1_SIZE, &pResult)) ... free(text1); return EXIT_SUCCESS; };
Ein anderer Fehler: du gibst den Speicher nicht frei, schähm dich.
btw: seit wann castet man in C ein void* in char* ???
-
free() - der Code war aus nem etwas groesserem raus-kopiert und zusammengeschnippselt, hatte free vergessen - DANKE!!
D.h. das ist wie bei den Filepointern oder beim nachallokieren von Speicher in ner Unterfunktion - also mit pointer von pointer? Wieder was gelernt..
Das mit dem Cast (char*) war so eine Idee/ein Verzweiflungsversuch..
-
Fabeltier schrieb:
D.h. das ist wie bei den Filepointern oder beim nachallokieren von Speicher in ner Unterfunktion - also mit pointer von pointer?
klar, die Methode ist diesselbe. Ein Zeiger ist auch nur eine Variable, von der eine Kopie erstellt wird, wenn du sie an eine Funktion übergibst. Die aufgerufene Funktion arbeitet dann mit einer Kopie des Zeigers, die aber auf die selbe Adresse zeigt, wie ihre Kopie. Deswegen kannst du über die Zeigerkopie die Daten ändern, worauf die Zeiger zeigen, jedoch nicht den Inhalt des Zeigers.
-
Danke fuer die Antwort
-
supertux schrieb:
btw: seit wann castet man in C ein void* in char* ???
Seit diesem Thread...
greetz, Swordfish