brauche Hilfe bei meinen C Anfängen
-
Hallo Leute,
ich hab die Thematik mit der Speicher allocierung noch nicht vollends verstanden.
Ich wollte mir eine kleine String Klasse bauen um damit herum zu spielen.
String.h
#include "MemoryTest.h" #include <stdbool.h> typedef char _char; typedef unsigned int sizetype; typedef struct{ sizetype length; _char* data; } String; String mkStringFromChars(_char* str); String mkStringForLength(sizetype l); void strDelete(String this);
String.c
#include <stdio.h> #include "String.h" String mkStringFromChars(_char* str) { sizetype size = 0; String* this = (String*) malloc(sizeof(String)); while (*(str + size) != '\0') { size++; } this->data = str; this->length = size; return *this; } String mkStringForLength(sizetype l) { String* this = (String*) malloc(sizeof(String)); this->data = NULL; this->length = l; return *this; } void strDelete(String this) { free(&this); }
Die MemoryTest.h zum zählen aller allocationen bzw. frees;
MemoryTest.h
#ifndef __MEMORY_TEST__H__ #define __MEMORY_TEST__H__ #include <stdlib.h> extern unsigned int speicherAlloc; extern unsigned int speicherFree; #define free(m)((speicherFree++,free(m))) #define malloc(m)((speicherAlloc++,malloc(m))) #define calloc(m1,m2)((speicherAlloc++,calloc(m1,m2))) #endif
Wenn ich nun aber einen main mit test funktionen etc. aufrufe bekomme ich die fehlermeldung:
String.c:26:5: note: in expansion of macro ‘free’
free(&this);Fragen:
1. Habe ich grundsätzlich was falsch gemacht bei der erzeugung/allocierung/free das Structs ?
1.1 muss ich auch den Speicher des "data" feldes im struct neu allocieren ?
2.Liegt der Fehler an den preprozessor Anweisungen (wenn ich diese nicht mit compeliere klapt es)?
Hab Vielen Dank
so long Maxwill
-
Maxwill2000 schrieb:
1. Habe ich grundsätzlich was falsch gemacht bei der erzeugung/allocierung/free das Structs ?
Ja.
Du übergibst der FunktionstrDelete
eine Kopie deiner struct.
Und somit versuchst du das lokale Objekt this freizugeben.
Das geht nicht.Aber dir geht ja schon die Adresse vom malloc flöten wenn du
return *this;
machst.Maxwill2000 schrieb:
1.1 muss ich auch den Speicher des "data" feldes im struct neu allocieren ?
Wäre ganz sinnvoll.
Vor allem, wenn du nochstrcat
nachbaust.Maxwill2000 schrieb:
2.Liegt der Fehler an den preprozessor Anweisungen (wenn ich diese nicht mit compeliere klapt es)?
Nein.
Da kennt der Compiler die Deklarationen der (Standard-)Funktionen nicht und kann somit den Fehler auch nicht feststellen.Lass dir mal in den Funktionen (auch main) die Adresse von this (wenn es ein Objekt ist) bzw von this selber (wenn es ein Pointer ist) ausgeben und vergleiche. Müßsste alles gleich sein.
Pointer bzw. Adressen kannst du bei printf mit %p ausgeben.printf(" this : %p\n", this); // bei Pointer printf("&this : %p\n", &this); // bei Objekt
Es gibt schon einen Standardisierten sizetyp. Der heißt
size_t
-
Hallo Dirk,
hab vielen dank für deine Antwort.
Ich hab meinen Denkfehler gefunden, ich brauch den String Struct selbst garnicht zu Allocieren, sondern nur die data im struct.Dank dir
so long Maxwill
-
typedef char _char;
Erkläre mir den für mich unergründlichen Sinn hiervon.