jap, das mit free ist klar
aber wenn man's nicht vergisst...?
die Anschluss-Frage wäre auch:
int16_t * buf;
buf = (int16_t *) malloc(arrlen);
oder:
buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );
...![]()
jap, das mit free ist klar
aber wenn man's nicht vergisst...?
die Anschluss-Frage wäre auch:
int16_t * buf;
buf = (int16_t *) malloc(arrlen);
oder:
buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );
...![]()
Spätestens wenn mehrere an einem Programm arbeiten, wird es irgendwann wer vergessen.
Deshalb sieht es in modernem C++ jetzt so aus, statt
nur nochCode:void f() { int* pi = new int; // ... delete pi; }
gelöscht wird automatisch, wenn irgendwo (auch durch eine exception) die Klammern verlassen werden.Code:void f() { auto pi = std::make_unique<int>(); // ... }
Die Zusatzfrage überlasse ich dann mal den sicher bald erscheinenden C-Experten.
C++ ist für mich definitiv keine Option, ich hasse Objekte wie der Teufel das Weihwasser...
a-Bär:
wenn eins hiervon richtig ist, wäre das schon mal gut zu wissen
(ich tippe aufs zweite...)
buf = (int16_t *) malloc(arrlen);
oder:
buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );
Hallo HaWe,
wie Du getippt hast:
ist die richtige Antwort.Code:size_t len = 8; int16_t *ptr = (int16_t*)malloc(arrlen * sizeof(int16_t)); /* Oder wenn's mit 0 initialisiert sein soll: *) ptr = (int16_t*)calloc(arrlen, sizeof(int16_t));
Allerdings ist es dann üblich mittels Pointer Arithemetik und nicht mit dem Array-Operator auf das Feld zuzugreifen also drittes Element im Feld;
ist aber Geschmackssache.Code:*(ptr + 2) = 32 * 27 + *(ptr + 1);
ok, super, danke - hatte ich beide getestet, Fehler besteht fort, dann liegt es nicht an malloc.
calloc kannte ich noch gar nicht, und es beantwortet eigtl sogar schon die nächste Frage, trotzdem, der Vollständigkeit halber:
wenn ich mit
buf = (int16_t *) malloc(arrlen*sizeof(int16_t) );
den array angelegt habe, wie kann ich ihn manuell (nachträglich) mit Null initialisieren?
Jetzt geht es also um memset...
ist das hier korrekt:
memset(buf, 0, sizeof(buf) );
...![]()
Nein, so geht's nicht, genau darin unterscheiden sich Arrays mit vorgegebener Größe gegenüber Speicherblöcken die mittels malloc & Co angelegt werden.
sizeof(buf) gibt die Bytes für die Größe des Zeigers buf zurück. Der weiß nix über das was malloc & free so treiben.
wäre korrekt.Code:memset(buf, 0, arrlen * sizeof(int16_t));
Du mußt hier zwischen der Feldlänge die Du vorgibst und der Anzahl der Bytes, die sich immer aus 'Feldlänge mal Datenentypgröße' ergibt, unterscheiden.
danke, mach ich so!
Lesezeichen