Here's a simple sketch. I have an array data and a variable idx. I'm assigning a value to each of the array element, and then sending them to my serial monitor.

volatile uint16_t data[5];
volatile uint16_t idx = 5;

void setup() {

  while (!Serial) { }

  data[0] = 1010;
  data[1] = 1011;
  data[2] = 1012;
  data[3] = 1013;
  data[4] = 1014;

  for(int i = 0; i< idx; ++i)

  while(1){  }

void loop() {}

When I look into my serial monitor, I get this:


Why is this happening? Did I overlook something fundamental? I'd appreciate if you could offer your thoughts on this.

I'm testing this code on Arduino Mega2560.

1 Answer 1


You got confused here:


You're printing array slice 5 (the sixth entry in a 5 entry array) 5 times.

You probably meant to write:


To improve clarity you may want to #define it instead:

#define DATA_SIZE 5
uint16_t data[DATA_SIZE];


for (int i = 0; i < DATA_SIZE; i++) {

Or you can do it the other way round (get the size from the array):

uint16_t data[5];
#define DATA_SIZE (sizeof(data) / sizeof(data[0]))
  • It's easy to go code-blind ;)
    – Majenko
    Sep 25, 2017 at 9:51
  • Terrible. Can't believe I missed such a simple thing. Perhaps I would've noticed if I labeled 'idx' as 'last_idx' or something clearer.
    – bot1131357
    Sep 25, 2017 at 9:55
  • For those kind of constants it's better to use a #define and use all capitals. I'll show you an example in my answer.
    – Majenko
    Sep 25, 2017 at 9:57
  • It's not a constant, but an incrementing index as I populate an array. ;-)
    – bot1131357
    Sep 25, 2017 at 9:59
  • 1
    Ah, right. Well, don't forget that the array size itself is fixed (something many users here don't realise), so you need to allocate all the memory up front.
    – Majenko
    Sep 25, 2017 at 10:00

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.