The body of a while loop that operates on a stack-allocated array is optimized away. Turning optimizations off gives correct bahviour. I observed this bug with gcc 3.2.2 on FreeBSD, other people have confirmed this for gcc 3.3.3 20031229 on Debian. This program: #include<stdio.h> void runBug(int lastElem) { int localArray[lastElem]; int j; for(j=0; j<lastElem; j++) localArray[j]=j; int temp=localArray[0]; size_t current=0; while (current<lastElem) localArray[current]=localArray[++current]; localArray[lastElem-1]=temp; for(j=0; j<lastElem; j++) printf("%i, ",localArray[j]); }; int main() { runBug(4); return 0; }; compiled with: gcc -O0 bug.c gives ./a.out 1, 2, 3, 0, (the while loop shuffles the list around, which is what I want). However with optimizations the loop reduces to incrementing the loop counter and nothing else: gcc -O2 bug.c gives: ./a.out 0, 1, 2, 0, Thanks, Axel.
This is invalid as this line: localArray[current]=localArray[++current]; you modified current twice which violates squence points.