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.
ahaaa... da könnte der seltsame Fehler begründet sein, das muss ich jetzt mal testen.
aber zu guter letzt, auch hier wieder die sizeof-Sache....:
Thema memcpy:
wenn ich einen array auf einen anderen kopieren will, habe ich bei statischen arrays verwendet
memcpy(array1, array2, sizeof(array2) );
nun ist array1 statisch und array2 ist dynamisch alloziert (mein buf).
geht das nun stattdessen so...
memcpy(array1, buf, arrlen * sizeof(int16_t) );
...![]()
Solange sizeof(array1) <= arrlen * sizeof(int16_t) ist und array1 vom typ int16_t ist - ja.
genau so ist es (beide arrays sind eigentlich gleich groß) -
perfekt, danke!
nun noch eine allerletzte Frage, ebenfalls wieder zu memset:
für den Fall, dass ich meinen dynamischen buf initialisieren will mit 128 statt mit 0, dann wäre doch vermutlich dieser Befehl dann auch richtig...
memset( buf, 128, arrlen*sizeof(int16_t) );
...![]()
danke, mach ich so!
Lesezeichen