Length of string is determined in runtime dynamically. String has length and capacity properties, when you define a new string it allocates extra space to create additional buffer in case you could expand this string.
For instance,
string str("abcdefgh");
length: 8
capacity: 15
If it had capacity of 8, adding any characters to the string would force a reallocation. By making the capacity larger than the actual string, this gives the user some buffer room to expand the string before reallocation needs to be done. Reallocation is expensive because, each character in the string has to be copied to the new memory.
And when you are creating an array of string, you are creating an array of pointers which holds start address of strings.
If you want to create array of different types you need to use array of void pointers like this;
void *ary[10];
ary[0] = new int();
ary[1] = new float();