Определение массива строк в С

Рейтинг: 1Ответов: 1Опубликовано: 22.01.2011

Я пробую определить массив строк двумя способами.

Первый вариант:

char *numbers[] = { "0", "1", "2", "3", "4" };

Второй вариант:

char **numbers = { "0", "1", "2", "3", "4" };

Оба варианта компилируются, но во втором случае компилятор выдает предупреждения и программа падает после запуска. Что не так во втором случае?

Сам код:

char **number = (char **)numbers;

for (int i = 0; i < 5; i++) {
    puts(numbers[i]);
}

Ответы

▲ 5Принят

Дело в том, что, char** strings и char* strings[2] - это переменные разных типов. Отсюда и все проблемы.

Можно сделать так:

char* strings[]={"111", "222"};
char** pStrings = strings;

Для добавления в массив можно попробовать такой код:

char **pStrings = 0;  // массив строк (обратите внимание на две звездочки **)
int str_count = 0;    // количество элементов в массиве

void AddString (const char *str)
{
  char **newStrings = new char* [str_count+1];
  memcpy (newStrings, pStrings, sizeof(char*)*str_count);
  delete [] pStrings;
  pStrings = newStrings;
  pStrings[str_count] = new char [strlen (str)+1];
  strcpy (pStrings[str_count], str);
  str_count++;
}

Дело в том, что создав указатель, потом нужно выделить место в памяти для переменной. В синтаксисе С это будет выглядеть так:

char **newStrings = new char* [str_count+1];

То есть как бы создается массив массивов с явным выделением памяти под каждый элемент. Прошу прощения, если что-то не так, давно не было практики на С, сильно привык к garbage collector'у.