Frage

Betrachten Sie diesen Code ein:

const char* someFun() {
    // ... some stuff
    return "Some text!!"
}

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}

In der Funktion someFun(), wo (ich glaube, es in einigen statischen Bereich von ROM sein kann) "Some text!!" gespeichert und was ist ihr Anwendungsbereich Lebensdauer?

Wird der Speicher zeigte durch retStr während des Programms belegt werden oder wenn der Block A Ausgänge freigegeben werden?

War es hilfreich?

Lösung

Die C ++ Standard-nicht sagen, wo Stringliterale gespeichert werden sollen. Es ist jedoch zu garantieren, dass ihre Lebensdauer die Laufzeit des Programms ist. Ihr Code ist daher gültig.

Andere Tipps

Die "Some text!!" keinen Anwendungsbereich . Anwendungsbereich ist eine Eigenschaft einer Namen Einheit. Genauer gesagt ist es eine Eigenschaft des Namens selbst. "Some text!!" ist ein namenlos Objekt - ein Zeichenfolgenliteral. Es hat keinen Namen, und deshalb keine Diskussionen über seinen „scope“ machen überhaupt keinen Sinn. Es hat keinen Raum.

Was scheinen Sie zu fragen, ist nicht Anwendungsbereich . Es ist Lebensdauer oder Speicherdauer von "Some text!!". Stringliterale in C / C ++ have statische Speicherdauer , was bedeutet, dass sie leben „für immer“, das heißt, solange das Programm läuft. So ist der Speicher belegt durch "Some text!!" nie freigegeben wird.

Nur im Kopf behalten (als Randnotiz), dass Stringliterale sind nicht modifizierbare Objekte. Es ist illegal, in diesen Speicher zu schreiben.

String wird statisch in speziellen gespeichert werden (in der Regel schreibgeschützt auf modernen OS) Abschnitt des Programms binär. Sein Speicher ist nicht zugeordnet (einzeln für die Zeichenfolge, nur für Gesamt Abschnitt, während es in den Speicher geladen) und wird nicht freigegeben werden.

  

Wird der Speicher zeigte durch retStr während des Programms belegt werden oder wenn der Block A Ausgänge freigegeben werden?

Edit:

Es ist nicht veröffentlicht, aber retStr wird nicht verfügbar sein. (Block scope)

const char *ptr;
{   
   const char* retStr = "Scope";
   ptr = retStr;
}   

printf("%s\n", ptr); //prints "Scope"

//printf("%s\n", retStr); //will throw error "retStr undeclared"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top