Forum: PC-Programmierung Uebergabe von Pointer auf String aus Funktion


von Alex L. (0xaffe)


Lesenswert?

Hallo µC.net!

Da dies meinen ersten Beitrag hier darstellt, möchte ich kurz sagen, 
dass ich dieses Forum richtig gut finde und froh bin, es gefunden zu 
haben, da man hier (im Gegensatz zu vielen anderen) richtig qualitativ 
hochwertige und fachlich einwandfreie Antworten auf seine Fragen 
bekommt.

Nun aber zu meinem Problem:

Ich will einen Pointer auf einen String (Char-Array) aus einer Funktion 
in das Hauptprogramm übergeben:
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4
5
char *testFunc()
6
{
7
    int n;
8
    char funcStr[]="test_text", *strPtr;
9
    n=sizeof(funcStr);
10
    strPtr =(char*)malloc(n);
11
    return strPtr; //warning: assignment makes pointer from integer without a cast
12
13
}
14
15
int main()
16
{
17
    char *mainPtr;
18
    mainPtr=testFunc(); //warning: assignment makes pointer from integer without a cast
19
20
    printf("%s", *mainPtr);
21
}
Als Entwicklungsumgebung nutze ich Code::Blocks, die Warnungen habe ich 
als Kommentar in die entsprechenden Codezeilen geschrieben. Nach Aufruf 
des Programms kommt nach wenigen Sekunden die Fehlermeldung: 
"<programm>.exe funktioniert nicht mehr".
Wo liegt der Fehler und wie kriege ich das Programm zum laufen?

Vielen Dank schonmal für eure Antworten!
affe

von Markus M. (mark_m)


Lesenswert?

Du solltest noch einen String in deinen dymanisch angelegten Speicher 
kopieren. So hat Du nur einen Speicherbereich der nicht mit '\0' 
abgeschlossen ist (Ein C-String muss aber per Definition damit enden) 
und printf() stürzt sich in den Tod.

Grüsse

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Alex L. schrieb:
>     char *mainPtr;
>     mainPtr=testFunc();
>
>     printf("%s", *mainPtr);

Was vermutest Du, wird printf hier übergeben, und was erwartet 
printf, wenn %s im Formatstring steht?

von Alex L. (0xaffe)


Lesenswert?

Vielen Dank für Eure Antworten zu aller Erst!

Markus M. schrieb:
> Du solltest noch einen String in deinen dymanisch angelegten Speicher
> kopieren. So hat Du nur einen Speicherbereich der nicht mit '\0'
> abgeschlossen ist (Ein C-String muss aber per Definition damit enden)
> und printf() stürzt sich in den Tod.
>
> Grüsse

Es geht darum, dass der String zuerst eingelesen wird, um daraus den 
benötigten Speicher zu kalkulieren und dementsprechend dynamisch zu 
reservieren. Woher weiss ich, ob der String mit '\0' endet? Bei der 
Abfrage mit
1
char funcStr[]="test_text"
2
printf("%c", funcStr[9]);
 wird mir ein Leerzeichen angezeigt, ist es das?

Rufus Τ. Firefly schrieb:
> Alex L. schrieb:
>>     char *mainPtr;
>>     mainPtr=testFunc();
>>
>>     printf("%s", *mainPtr);
>
> Was vermutest Du, wird printf hier übergeben, und was erwartet
> printf, wenn %s im Formatstring steht?

Ich vermute, dass die Adresse des ersten Zeichen des Strings in der 
Funktion an die main-Funktion übergeben wird und auf genau diese der 
Pointer *mainPtr zeigt.

Ich hoffe, Ihr könnt damit etwas anfangen!

von Markus M. (mark_m)


Lesenswert?

Ein C-String ist ein Array von char dessen letztes Element '\0' enthält. 
Alle Stringfunktionen lesen so lange Daten ein bis sie auf '\0' treffen.

Wird kein '\0' gefunden -> Programmabsturz!!!!

Wo gibst Du ein '\0' an?

Bei dieser Initialisierung eines C-Strings hängt der Compiler das '\0' 
automatisch an.
1
char text1[] = "Hello"; // Dieses ist ein C-String, Compiler hängt '\0' an
2
char text2[] = { 'H', 'e', 'l', 'l', 'o' }; // Dieses ist kein C-String nur ein gemeines Array
3
char text3[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; // Dieses ist ein C-String

Ich empfehle mal in die Literatur zu schmökern und dich mit dem C-String 
und seinen Besonderheiten vertraut zu machen.

von Mik (Gast)


Lesenswert?

Alex L. schrieb:
> Ich vermute, dass die Adresse des ersten Zeichen des Strings
 Von welchem String redest du jetzt hier? funcStr? dann nein

> in der  Funktion an die main-Funktion übergeben
 BTW An die main wird nichts übergeben es wird zurückgegeben
>wird und auf genau diese

>  der Pointer *mainPtr
 Was ist an diesen drei Worten falsch? das ist genau das was Rufus schon 
anspielte.

>zeigt.
 Gibst du wirklich irgendetwas von funcStr zurück?
 Wohin zeigt strPtr wirklich?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.