Wieder Probleme mit Speicherreservierung bei Strings und Socketprogrammierung



  • Ich habe ein einfaches server-Programm, welches eine Bytekette einliest und sie in einem globalen *char als String ablegen soll.
    Der Kern ist:

    Global definiert:

    char* receivedString = NULL;
    

    Funktion zum Einlesen 1. Versuch:

    char acReadBuffer[kBufferSize];
    int numReadBytes;
    
    numReadBytes = recv(sd, acReadBuffer, kBufferSize, 0);
    
    free(receivedString);
    receivedString = (char*) malloc( sizeof(char)*numReadBytes );
    
    strcpy(receivedString, acReadBuffer);
    

    Dabei kam aber der Fehler, es würde Speicher außerhalb des heaps angefordert werden.

    Funktion zum Einlesen 2. Versuch:

    char acReadBuffer[kBufferSize];
    int numReadBytes;
    
    numReadBytes = recv(sd, acReadBuffer, kBufferSize, 0);
    
    if(receivedString != NULL)
       realloc(receivedString, sizeof(char)*numReadBytes);
    else
       receivedString = (char*) malloc( sizeof(char)*numReadBytes );
    
    strcpy(receivedString, acReadBuffer);
    

    Dabei geschieht allerdings auch ein Speicherfehler, so dass das Programm vorzeitig terminiert.

    Was mache ich falsch?



  • Trace-Ausgabe in Dateien

    int main()
    {
      UnlinkPrint();
      ...
      Print(3, "[A]\n");
      ...
      Print(3, "[B Preis %i]\n", Schweinehaelfte);
      ...
      Print(3, "Schweine im Weltall\n");
      return(0);
    }
    
    void Print(int channel, char *format, ...)
    {
      char *fn;
      FILE *fp;
    
      fn = "printx.txt";
      fn[5] = (char)('0'+(channel%10));
      if (format == 0)
        { unlink(fn);
          return;
        }
      if ((fp = fopen(fn, "at")) == 0)
          return;
      vfprintf(fp, format, (&format)+1);
      fclose(fp);
    }
    
    void UnlinkPrint(void)
    {
      int i;
    
      for (i = 0; i < 10; i++)
          Print(i, 0);
    }
    

    Ich würde in den Quelltext ein paar Ausgaben reinsetzen, um zu schauen, wo das Programm genau abbricht.


Anmelden zum Antworten