C++: Containers: Example 1 Using Array

One of three contrasting examples of solving the problem with increasingly powerful tools: using arrays, then vectors, then stacks.
// Read words and print them in reverse order.
//   Variation 1: Fixed array sizes, use new to copy word.
// Fred Swartz 2001-11-08, 2001-12-04

#include <iostream>  // for cin, cout
#include <cstring>   // for strlen, strcpy
using namespace std;

int main() {

    char *allwords[1000]; // array of POINTERS to char strings
    char word[500];       // input buffer for longest possible word.
    int n = 0;            // count of number of words.

    // read words/tokens from input stream
    while (cin >> word) {
        allwords[n] = new char[strlen(word)+1]; // allocate space
        strcpy(allwords[n], word);      // copy word to new space
        n++;
    }

    cout << "Number of words = " << n << endl;

    // write out all the words in reverse order.
    //    The dynamically allocated space is freed after the word
    //    is printed, and the pointer is set to NULL.  This isn't
    //    necessary here because the program immediately terminates,
    //    but it's a good, safe practice.
    for (int i=n-1; i>=0; i--) {
        cout << allwords[i] << endl; // print the word
        delete [] allwords[i];       // free space
        allwords[i] = NULL;          // remove pointer
    }
    return 0;
}//end main
The big problem with this program is that is is subject to buffer overflow bugs -- words larger than 499 characters or more than 1000 words will simply overflow the arrays until something so serious happens that the program can't continue running. Let's hope it didn't overwrite one of you open output file buffers, for example.