C: dynamische länge eines Strings

steveo6666

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


Code:
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:

Code:
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?
 
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
 
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?
Code:
strcpy((neu_knot->dat.name), &c[0]);

aber das scheint nicht so zu funktionieren wie ich mir das vorgestellt habe ;)
 
Was funktioniert denn nicht so wie dus dir vorgestellt hast? Eine genauere Fehlerbeschreibung wäre da hilfreich.

Ansonsten guck mal hier:

C:
#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
 
Zurück