bleicher: wieder mal C-pointer^^

Grüße,
ich will mich an dieser stelle noch bei allen die bei der "große-zahlen-frage" halfen bedanken ;)

stehe aber wieder mal vor einer verständnissfrage -
die genialen aufgabenmacher schrieben nun vor, dass array in einer externen function initialisiert wird, die idee war - ich defineire in der main einen pointer auf ein string, und gebe den an eine 2e funktion die über malloc den nötigen speicher reserviert und den pointer darauf richtet.

nur scheint die syntax zu hinken -

  
char *text;  
  
initArray(text,i);  

ist falsch - "text wird benutzt ohne initailisert zu sein"

initilaisiere ich den mit NULL, gibts kritische fehler nach

void initArray(char *text, int size){
int i=100;
text=(char*)malloc(size+1);
}

void readText(char *text){
gets(text);<----exakt hier bockt es - denn text bleibt "BadPt"?
}

Fehlermeldung besagt "Expression:(String!=NULL)"

auf hinweise würde ich mich freuen^^
MFG
bleicher

  1. Hi,

    nur scheint die syntax zu hinken -

    Nein, das liegt nicht an der Syntax, sondern am Verständnis.
    Entweder du verwendest einen Pointer auf einen Pointer, oder du gibst den Pointer mit return zurück.
    Weil wenn du so wie momentan die Funktion initArray() aufrufst wird *text in main() nicht verändert und zeigt nach wie vor auf eine zufällige Speicheradresse (weil nicht initialisiert) und nicht auf den extra reservierten Speicher.

    mfG,
    steckl

    1. Grüße,

      Entweder du verwendest einen Pointer auf einen Pointer, oder du gibst den Pointer mit return zurück.

      die funktionen MÜSSEN "void" sein :(

      zeiger übergibt man doch mit &?

      aber

      initArray(&text,i);

      führt zu
      error C2664: 'initArray' : cannot convert parameter 1 from 'char **__w64 ' to 'char *'

      MFG
      bleicher

      1. Hi bleicher!

        error C2664: 'initArray' : cannot convert parameter 1 from 'char **__w64 ' to 'char *'

        Logisch, es wird ja auch ein Zeiger auf einen Zeiger auf ein char erwartet.
        Also: void readText(char **text)

        Ich hoffe, ich hab jetzt keinen Mist erzählt. =)

        MfG H☼psel

        --
        "It's amazing I won. I was running against peace, prosperity, and incumbency."
        George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
        Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
        1. Hi,

          Logisch, es wird ja auch ein Zeiger auf einen Zeiger auf ein char erwartet.
          Also: void readText(char **text)

          In dem Beispiel ist es initArray() und nicht readText(), aber das mit den ** stimmt so. Beim Aufruf von readText() reicht dann ein einfacher Zeiger.

          Ich habe noch eine gute Erklärung zu dem Thema gefunden, in dem auch fast die gleiche Funktion wie bleichers initArray() vorkommt.
          Wenn man das alles verstanden hat darf man sich 2-Sterne-Programmierer nennen. ;)

          mfG,
          steckl

      2. Hallo,

        » Entweder du verwendest einen Pointer auf einen Pointer, oder du gibst den Pointer mit return zurück.

        die funktionen MÜSSEN "void" sein :(

        bitte Randbedingungen *vorher* erwähnen.

        aber
        initArray(&text,i);

        führt zu
        error C2664: 'initArray' : cannot convert parameter 1 from 'char **__w64 ' to 'char *'

        Du musst natürlich diese Änderung auch bei der Funktion durchführen:

        Statt:

        void initArray(char* text, int size);

        musst Du

        void initArray(char** text, int size);

        verwenden [1], wenn Du einen Zeiger auf einen Zeiger auf char übergibst.

        Freundliche Grüße

        Vinzenz

        [1] warum ich die Notation char* text; der Notation char *text; vorziehe.