*Markus: (C) seltsamer calloc-Fehler + Pointerfragen

Beitrag lesen

Hallo,

leider bringen sämtliche Kombinationen nicht das gewünschte Ergebnis. Das Programm stürzt weiter ab genauso wie vorher. Kommentiere ich in Main.c die zweiten setter und getter aus, wird zwar die erste Ausgabe angezeigt, doch dann bekomme ich wieder den Heap-Crash mit free(). Irgendwie ist das Ganze unberechenbar. Hier die aktuelle Version:

Main.c
-----------------------------------------

  
#include <stdio.h>  
#include <stdlib.h> 					//malloc  
#include "metadata.h"  
  
int main(void)   {  
  
    MetaData m1 = malloc(sizeof(struct metadata));  
    //m1 ist gleichbedeutend mit *&m1  
    setMetaDataBezeichnung(m1, "Das ist die erste Bezeichnung");  
    setMetaDataZusatzInfo(m1, "Das ist eine zusätzliche Information");  
    printf("%s\n", getMetaDataBezeichnung(m1));  
    printf("%s\n", getMetaDataZusatzInfo(m1));  
  
    destroyMetaData(m1);  
  
return 0;  
}  
  
metadata.h  
-----------------------------------------  
#ifndef METADATA_H  
#define METADATA_H  
  
#define MAX_INFO 100  
#define MAX_BEZ 50  
  
struct metadata  {  
	char *bezeichnung;  
	char *zusatzinfo;  
};  
  
typedef struct metadata *MetaData;  
  
void setMetaDataBezeichnung(struct metadata *m, const char *s);  
void setMetaDataZusatzInfo(struct metadata *m, const char *s);  
char* getMetaDataBezeichnung(struct metadata *m);  
char* getMetaDataZusatzInfo(struct metadata *m);  
void destroyMetaData(struct metadata *m);  
  
#endif  
  
  
Metadata.c  
-----------------------------------------  
#include <stdio.h>  
#include <string.h>			//strlen, strncpy  
#include <stdlib.h>			//calloc  
#include "metadata.h"  
  
void setMetaDataBezeichnung(struct metadata *m, const char *s)  {	  
	 //Falls Zeichenkette länger als MAX_BEZ ist, nur MAX_BEZ+1 (+1 wg. \0) allozieren.  
	 if (strlen(s) >= MAX_BEZ)  
	    m->bezeichnung = (char*)calloc(MAX_BEZ+1,sizeof(char));  
	 else  
	 	 m->bezeichnung = (char*)calloc(strlen(s)+1,sizeof(char));  
	 	  
	 if (m->bezeichnung == 0)  {  
	 	 printf("Fehler bei der Speicherallozierung");  
	 	 exit(1);  
	 }  
	 //Maximal MAX_BEZ Zeichen kopieren. \0 wird automatisch angehängt, da +1 noch frei ist.  
	 strncpy(m->bezeichnung, s, MAX_BEZ);  
}  
  
void setMetaDataZusatzInfo(struct metadata *m, const char *s)   {  
	 //Falls Zeichenkette länger als MAX_INFO ist, nur MAX_INFO+1 (+1 wg. \0) allozieren.  
	 if (strlen(s) >= MAX_INFO)  
	    m->zusatzinfo = (char*)calloc(MAX_INFO+1,sizeof(char));  
	 else  
	 	 m->zusatzinfo = (char*)calloc(strlen(s)+1,sizeof(char));  
	 	  
	 if (m->zusatzinfo == 0)  {  
	 	 printf("Fehler bei der Speicherallozierung");  
	 	 exit(1);  
	 }  
	 //Maximal MAX_INFO Zeichen kopieren. \0 wird automatisch angehängt, da +1 noch frei ist.  
	 strncpy(m->zusatzinfo, s, MAX_INFO);  
}  
  
char* getMetaDataBezeichnung(struct metadata *m)   {  
	 return m->bezeichnung;  
}  
  
char* getMetaDataZusatzInfo(struct metadata *m)   {  
	 return m->zusatzinfo;  
}  
  
void destroyMetaData(struct metadata *m)   {  
	if (m->bezeichnung != NULL)  
		free(m->bezeichnung);  
	if (m->zusatzinfo != NULL)  
		free(m->zusatzinfo);  
		  
	free(m);  
}  
  

Danke,
Markus