An array of C-strings is two-dimentional array of NULL-terminated strings. Examine the initialization: char szSymbols[10][6] = { "INTL", "MSFT", "ORCL", "CSCO", "SANYY" }; Two-dimentional array szSymbols contains NASDAQ symbols that can be 4 or 5 letters long only. C-arrays are zero-based. Therefore symbols referred as szSymbol[0] ... szSymbol[9]. If i - total number of elements in array then szSymbol[0] refers to the first element and szSymbol[i-1] to the last. The value inside first square brackets in initialization show total number of elements in C-string array. The value inside second square brackets gives length of element plus one for NULL-termination character '\0'. The szSymbols arrays is party initialized. Unlike underinitializing in the example, overinitializing produces Microsoft compiler error: 'too many initializers'. The compiler generates error message 'array bounds overflow' if C-string element has more then 5 letters. When number of elements in array is indefinite the following initialization is used: char szSymbols[][6] = { "INTL", "MSFT", "ORCL", "CSCO", "SANYY" }; An advantage of the last initialization is that it takes two times less memory to allocate: 30 bytes versus 60 bytes for the first type of initialization. Most memory-saving way to initialize array of C-strings is to use array of pointers: char * pszSymbols[] = { "INTL", "MSFT", "ORCL", "CSCO", "SANYY" }; On Windows 2000 each pointer takes 4 bytes. Hence pszSymbols array will take 20 bytes of memory.