Warning C4172



  • Der Compiler gibt mir diese Warnung aus, obwohl der return-Wert richtig ist/passt.

    char *Function(char *src) {
         char target[MAX_PATH];
    
         //code..
    
         return target;
    }
    

    Ich könnte ihn teilweise zwar umgehen, jedoch hab ich da das Problem, dass ich den Speicher nicht mehr freigeben kann:

    char *Function(char *src) {
         char *target = new char[MAX_PATH];
    
         //code..
    
         return target;
         //delete[] target;
    }
    

    Naja, das funktionert dann halt auch nicht, denn ich kann die Variable ja nicht vor dem verwenden löschen.


  • Mod

    Die Warnung (es wäre übrigens schön, wenn du die Warnung genannt hättest, nicht die Nummer) bekommst du, weil du einen Zeiger auf eine lokale Variable zurück gibst.

    Zu deiner "Lösung":
    1. new ist C++.
    2. In C++ würde man niemals new so benutzen
    3. Auch das C-Äquivalent malloc würde man nur äußerst selten so benutzen, wegen der schon von dir selbst erkannten Probleme

    Eine bessere Lösung: Kommt drauf an, was du erreichen möchtest. Es ist in C sehr ungewöhnlich ein Array aus einer Funktion zurück geben zu wollen, gerade weil das eben nicht geht. Falls eine Funktion ein Array irgendwie befüllen soll, übergibt man ihr vielmehr das fragliche Array. So bleibt die Verantwortung für das Array klar beim Aufrufer. Diese klare Trennung der Verantwortlichkeiten solltest du dir angewöhnen. Wer Speicher besorgt, gibt ihn auch wieder frei. Wer Daten verändert, macht nichts bezüglich der Verwaltung der Daten.



  • Hab die Warnung ganz vergessen, jedoch hast Du es schon gesagt:

    warning C4172: Adresse einer lokalen Variablen oder eines temporären Werts wird zurückgegeben
    

    Ein Array (src) wird eingelesen und mit diesem string wird dann ein Output-string vorbereitet und wieder zurückgegeben.
    Also sollte ich, wie Du schon sagtest, kein Array zurückgeben, sondern per strcpy kopieren?



  • Also sollte ich, wie Du schon sagtest, kein Array zurückgeben, sondern per strcpy kopieren?

    Mit strcpy musst du es nicht kopieren, nur halt kein neues Array zurückgeben:

    void Function(char * dest, const char *src) {  
    
         //code to fill dest
    
    }
    

    Somit hat der Aufrufer die Plicht beide Arrays bereitzustellen und sich um ihre eventuelle Freigabe zu kümmern.



  • Oder so, Dankeschön. 🙂


Log in to reply