Копирование массива символов * повреждает данные

Я относительно новичок в C в целом, и у меня есть проблема с некоторым кодом. Это довольно простой код: целью кода является копирование заданного массива указателей на символы или, другими словами, источника char **, в указанное место назначения char **.

Проблема, с которой я сталкиваюсь, заключается в том, что иногда (обычно, когда у меня более 2 строк в исходном коде) первый элемент полностью повреждается, и когда я в конечном итоге распечатываю пункт назначения, он печатает что-то вроде "; @?" для первого элемента, а остальные элементы печатаются нормально.

Код, который выполняет копирование:

void CopyArrayOfStrings(char **source, int numStrings)
{
   char **destination = malloc(numStrings);

    for (int i = 0; i < numStrings; i++)
    {
        destination[i] = malloc(strlen(source[i] + 1);
        strcpy(destination[i], source[i]);
    }
}

Обратите внимание, что я пропустил код, проверяющий, является ли результат malloc равным NULL.


person Josh Abram    schedule 04.11.2012    source источник
comment
Почему бы не использовать strdup() для дублирования строк?   -  person Christoffer    schedule 04.11.2012
comment
Должно быть, я пропустил тот факт, что существует strdup, спасибо!   -  person Josh Abram    schedule 04.11.2012


Ответы (2)


Вам нужно изменить распределение destination как:

char **destination = malloc(numStrings*(sizeof(char*)));

чтобы выделить количество указателей char * для хранения строк.

Также убедитесь, что вы правильно передаете char ** в качестве исходного массива строк.

person Rohan    schedule 04.11.2012
comment
Кажется, работает нормально с этим небольшим изменением, большое спасибо :) - person Josh Abram; 04.11.2012

Ты делаешь это неправильно.

void CopyArrayOfStrings(char **source, int numStrings)
{
   char **destination = malloc(numStrings * sizeof(char *));

    for (int i = 0; i < numStrings; i++)
    {
        destination[i] = malloc(strlen(source[i]) + 1);
        strcpy(destination[i], source[i]);
        //alternatively you can use strdup() as suggested by @Christoffer
    }
}

Это даст вам место для хранения numStrings массивов. Каждый элемент которого будет указывать на строку с завершающим нулем.

person Aniket Inge    schedule 04.11.2012