Question: Here *len* is at A[10] and *i* is at A[11]. Is there a way to catch these errors??
I tried compiling with gcc -Wall -W but no warnings are displayed.

```
int main()
{
  int A[10];
  int i, len;
  len = sizeof(A) / sizeof(0[A]);
  printf("Len = %d\n",len);
  for(i = 0; i < len; ++i){
    A[i] = i*19%7;
  }
  A[i] = 5;
  A[i + 1] = 6;
  printf("Len = %d i = %d\n",len,i);
  return 0;
}

```

**Output :**
Len = 10
Len = 5 i = 6

Answer: 
You are accessing memory outside the bounds of the array; in C, there is no bounds checking done on array indices.

Accessing memory beyond the end of the array technically results in *undefined behavior*. This means that there are no guarantees about what happens when you do it. In your example, you end up overwriting the memory occupied by another variable. However, undefined behavior can also cause your application to crash, or worse.

> 
> Is there a way to catch these errors?
> 
> 
> 

The compiler can catch some errors like this, but not many. It is often impossible to catch this sort of error at compile-time and report a warning.

Static analysis tools can catch other instances of this sort of error and are usually built to report warnings about code that is likely to cause this sort of error.
i's location in memory is just past the end of A. That's not guaranteed with every compiler and every architecture, but most probably wouldn't have a reason to do it any other way. 

Note that counting from 0 to 9, you have 10 elements.