# C: dynamische länge eines Strings



## steveo6666 (22. Dezember 2007)

Hi! 
Ich bin gerade dabei in c einen binären Baum zu erstellen. Ein Knoten soll die folgenden Daten enthalten:



```
typedef struct knot {
  struct dat {             /* Nutzdaten */
    char *name;
    char natio[3];         /* 2-letter Laendercode (DE, AT etc.)*/
    char zeit[9]; } dat;   /* HH:MM:SS */
  struct knot *lin;        /* linker Teilbaum */
  struct knot *rec;        /* rechter Teilbaum */
 } knot;
```

Ich möchte nun dem *name eine dynamische Länge zuweisen, je nach Länge des eingegeben Namens:


```
knot *eingab()
{
	knot *neu_knot;
	char c[255];
	int nameLen;

	neu_knot = (knot*)calloc(1,sizeof(knot));		

	printf(" Name: ");
	scanf("%s", &c);
	nameLen = strlen(c);
	neu_knot->dat.name = (char*)calloc(nameLen, sizeof(char));
	
	printf("c: %s\n", c);
	printf("strlen(c): %i\n", strlen(c));
	printf("nameLen: %i\n", nameLen);
	printf("sizeof(neu_knot->dat.name): %i\n", sizeof(neu_knot->dat.name));
......
```

Eingabe:
Name: aa

Ausgabe:
c: aa
strlen(c): 2
nameLen: 2
sizeof(neu_knot->dat.name): 4

Warum ist sizeof(neu_knot->dat.name) 4 groß? Eigentlich sollte es in diesem Fall die Größe 2 annehmen. Auch wenn ich 20 Zeichen eingeb, wird die Größe 4 angegeben.

Wo liegt mein Fehler?


----------



## RedWing (22. Dezember 2007)

Hallo,

sizeof bestimmt die Größe eines Objektes zur Kompilierzeit. Folglich kann sizeof nur die Größe statischer Objekte (Objekte die auf dem Stack liegen) bestimmen. Der Speicherplatz für dein Array liegt aber auf dem Heap weil er dynamisch also während der Laufzeit angelegt wird. Darum kann dir sizeof nur die Größe deines Zeigers ausgeben, welcher auf dem Stack abgelegt wird und auf 32 bit Architekturen 4 byte besitzt.



> ... Eigentlich sollte es in diesem Fall die Größe 2 annehmen. ...



Naja in diesem Falle wohl eher 3, da ein String immer mit '\0' terminiert wird.

Gruß,
RedWing


----------



## steveo6666 (22. Dezember 2007)

RedWing hat gesagt.:


> Hallo,
> 
> sizeof bestimmt die Größe eines Objektes zur Kompilierzeit. Folglich kann sizeof nur die Größe statischer Objekte (Objekte die auf dem Stack liegen) bestimmen. Der Speicherplatz für dein Array liegt aber auf dem Heap weil er dynamisch also während der Laufzeit angelegt wird. Darum kann dir sizeof nur die Größe deines Zeigers ausgeben, welcher auf dem Stack abgelegt wird und auf 32 bit Architekturen 4 byte besitzt.



ok das klingt logisch 


Wie kopiere ich denn nun den Inhalt des Arrays in neu_knot->dat.name?

```
strcpy((neu_knot->dat.name), &c[0]);
```

aber das scheint nicht so zu funktionieren wie ich mir das vorgestellt habe


----------



## RedWing (22. Dezember 2007)

Was funktioniert denn nicht so wie dus dir vorgestellt hast? Eine genauere Fehlerbeschreibung wäre da hilfreich.

Ansonsten guck mal hier:


```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main (int argc, char *argv[])
{
  char *name, input[255];

  printf ("Name: ");
  scanf ("%254s", input);

  name = (char *) malloc (strlen (input) + 1); /* an Platz fuer '\0' denken! */
  strcpy (name, input);

  printf ("name has value '%s'\n", name);

  return 0;
}
```

Gruß,
RedWing


----------

