// Using the heap for memory allocation #include "mem_syms.h" #define ADDR DEC void print_heap_stats() { Serial.print("Avail mem:"); Serial.println(AVAIL_MEM, DEC); Serial.print("Heap size:"); Serial.println(HEAP_SIZE, DEC); Serial.print("Heap starts at:"); Serial.println((unsigned int) HEAP_START, ADDR); Serial.print("Heap ends at:"); Serial.println( (unsigned int) HEAP_END, ADDR); } void print_array(int a[], unsigned int len) { Serial.print("array at "); Serial.print( (unsigned int) a, ADDR); Serial.print(" has len "); Serial.println(len); if ( ! a ) { // oops, no array Serial.println("Null pointer!"); return; } for (int i=0; i < len; i++ ) { Serial.print(a[i], DEC); if (i < len-1) { Serial.print(","); } } Serial.println("."); } // create a new array of ints, of length len, and fill with // some data int * make_random_array(unsigned int len) { Serial.println("make random array"); int *a; a = (typeof(a)) malloc(sizeof(*a) * len); // always check the return code of malloc if ( a == 0 ) { Serial.println("No memory!"); while ( 1 ) {} } for (int i=0; i < len; i++) { // note a[i] is just shorthand for *(a+i) // where the units of i are sizeof thing pointed to by a a[i] = random(0, 100); } return a; } void setup() { Serial.begin(9600); Serial.println("MEM09 - dynamic arrays"); unsigned int array_1_len; int * array_1; unsigned int array_2_len; int * array_2; unsigned int array_3_len; int * array_3; print_heap_stats(); array_1_len = 20; array_1 = make_random_array(array_1_len); print_heap_stats(); print_array(array_1, array_1_len); Serial.println("free 1"); free(array_1); print_heap_stats(); array_2_len = 10; array_2 = make_random_array(array_2_len); print_heap_stats(); print_array(array_2, array_2_len); array_3_len = 10; array_3 = make_random_array(array_3_len); print_heap_stats(); print_array(array_3, array_3_len); Serial.println("free 2"); free(array_2); print_heap_stats(); Serial.println("free 3"); free(array_3); print_heap_stats(); } void loop() { }