Größe von C-String, referenziert duch einen Zeiger



  • Hallo @all,

    gibt es eine Möglichkeit mit bestehenden Funktionen der C-Library zu ermitteln, wie groß die Speicherbelegung entsprechender Strukturen, Variablentypen ist?

    Mit dem sizeof-Operator lässt sich ja nativ bestimmen, wie groß beispielsweise ein char, short, long, float, double etc. auf dem vorliegenden System ist.

    Wie kann ich aber den kompletten Speicherbedarf eines Zeigers und dazugehörigen Strings ermitteln?

    char* name = "Ein Name";
    

    sizeof(name) ergibt die Größe des Zeigers, sprich 4 oder 8 Bytes.
    Nun wird darin aber ein Text gespeichert mit 8 Buchstaben (inklusive Leerzeichen) und einem Zeichen für das terminierende \0. Das heißt, eigentlich müsste der Speicherbedarf ja 9 char's betragen, also 9 Bytes + 4 Bytes für den Zeiger (auf einem 32-Bit-System), also 13 Bytes. Ist das so korrekt?

    Falls ja, wie kann ich den kompletten Speicherbedarf am Sinnvollsten berechnen, so dass ich sofort auf 13 Bytes komme? 😕



  • Nein, wie sollte das denn auch gehen, denk doch mal nach!



  • char name[] = "Ein Name";
    

    dann geht sizeof



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)
    {
      char* name = "Ein Name"; 
      int nameLength;
      int i;
      int sum=0;
    
      nameLength = strlen(name);
      for(i=0;i<nameLength; i++){
          sum+=sizeof(*name);
          name ++;
      }
      printf("%d\n",sum);
      system("PAUSE");	
      return 0;
    }
    

  • Mod

    Dressman1981 schrieb:

    Falls ja, wie kann ich den kompletten Speicherbedarf am Sinnvollsten berechnen, so dass ich sofort auf 13 Bytes komme? 😕

    Warum würdest du das wollen? Ich kann verstehen, dass man entweder die Zeigergröße oder die Stringgröße betrachten will, bei beiden zusammen erschließt es sich mir dagegen nicht.



  • @Inf.Student: So "sinnvolle" Beiträge hab ich von einem Studenten erwartet. 😉

    @123: Den Umweg über ein char-Array hab ich bereits probiert, das geht aber daran vorbei, was ich eigentlich erreichen möchte, zeigt aber dass das Array ebenfalls nullterminiert wird.

    @zb. so: Den Weg über die Bestimmung mit strlen() hätte ich auch gewählt. Ich dachte, es gibt eine einfachere Möglichkeit bzw. eine vorhandene Funktion die man dazu vielleicht nutzen könnte. Danke, für den Codeausschnitt.

    @camper: Ich möchte den kompletten Speicherbedarf bestimmen, der tatsächlich belegt wird. Das ist nun mal in diesem Fall die Größe des belegten Speicherplatzes durch den Zeiger + zusätzlich die des 0-termninierten Strings.


  • Mod

    Dressman1981 schrieb:

    @camper: Ich möchte den kompletten Speicherbedarf bestimmen, der tatsächlich belegt wird. Das ist nun mal in diesem Fall die Größe des belegten Speicherplatzes durch den Zeiger + zusätzlich die des 0-termninierten Strings.

    Aber warum - sprich zu welchem Zweck - du das ermitteln willst, hast du nicht beantwortet.
    Ein Zeiger, der in ein Array zeigt, kennt niemals die Größe dieses Arrays - diese Information ist dem Array selbst vorbehalten, folglich muss das Array (also das Stringliteral selbst) das Argument des sizeof-Operators sein:

    sizeof name+sizeof "Ein Name"
    


  • Ja ok.

    Mir ging es nur darum mal zu bestimmen wie viel Speicherplatz tatsächlich durch ein Programm bzw. die verwendeten Variablentypen belegt wird.

    Ich dachte es gibt vielleicht eine rekursive Funktion, die abhängig vom Zeiger, auch die Größen der dahinter liegenden Strukturen/Datentypen ermitteln kann. Sei es jetzt ein String oder ein Zahlenwert etc.

    Da es sowas ganz offensichtlich nicht gibt kann ich mit den angesprochenen Informationen ganz gut leben.



  • ^^wenn du einen zeiger hast, der auf einen 0-terminierten string zeigt, dann hilft 'strlen'
    🙂



  • Sollte ich jetzt lügen, hättest du meine Antwort dann als sinnvoller empfunden?

    gibt es eine Möglichkeit mit bestehenden Funktionen der C-Library zu ermitteln, wie groß die Speicherbelegung entsprechender Strukturen, Variablentypen ist?

    Die gibt es in C eben nicht. Ob du die Antwort jetzt sinnvoll findest oder nicht!


Log in to reply