Если вы хотите создать массив строк фиксированного размера с переменным размером:
char **arr = calloc(len, 50 * sizeof(char));
Не забудьте освободить память!
for(unsigned long i = 0; i < len; ++i)
free(*arr++);
Вы не собираетесь динамически выдвигать элементы? Если так, то нам придется немного усложниться. (Я бы добавил StringArray::capacity
, чтобы ускорить push
, но я не хочу слишком усложнять вещи ... Видя, как я сосу у C, если вы посмотрите на комментарии ниже.;))
struct StringArray
{
char** arr;
unsigned long len = 0;
};
StringArray StringArray_init(char** arr = NULL, unsigned long len = NULL)
{
StringArray a;
a.arr = arr;
a.len = len;
return(a);
}
void StringArray_push(StringArray *a, char* str)
{
if(len == 0)
{
a.arr = StringArrayInit(malloc(sizeof(char*)), 1);
}
else
{
a.len++;
}
a.arr = realloc(a.arr, a.len * sizeof(char*));
a.arr[a.len - 1] = malloc((strlen(str) + 1) * sizeof(char));
strcpy(a.arr[a.len - 1], str);
}
void StringArray_free(StringArray a)
{
for(unsigned long i = 0; i < a.len; ++i)
free(a.arr[i]);
}
StringArray szArr = StringArray_init();
StringArray_push(&szArr, "This is a string.");
StringArray_free(szArr);
С C ++ это намного проще. :)
std::vector<std::string> arr;
arr.push_back("This is a string.");