Этот вопрос связан с Созданием массива для хранения Массивы массивов символов в C
Заимствуя код оттуда, у меня есть что-то похожее на это (благодарю luser droog за хороший пример кода):
enum { BUFSZ = 50 };
enum { STRVSZ = 40 };
enum { STRVVSZ = 20 };
char buf[BUFSZ + 1];
char *strv[STRVSZ + 1];
char **strvv[STRVVSZ + 1];
int j;
int i;
while(1){
fgets(buf, BUFSZ, infile);
i = 0;
strv[i] = strdup(buf);
strv[i+1] = NULL;
j = 0;
strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements
memcpy(strvv[j], strv, i * sizeof *strvv[j]);
j++;
}
Это может не сразу выйти за дверь, но иллюстрирует нечто похожее на то, что я запускаю. По сути, содержимое strv должно сохраняться в strvv после каждой итерации цикла, а strv со временем изменяется в зависимости от пользовательского ввода.
Использование calloc и memcpy должно было заставить strvv сохранять копии strv на каждой итерации цикла независимо от значений в strv. Однако, когда я распечатываю содержимое strvv, оно выводит одну и ту же строку для каждой записи, подразумевая, что текущий подход по-прежнему перемещает указатели и не создает копии strv в каждой записи strvv.
Я вообще не уверен, почему это происходит и как это исправить. memcpy должен копировать на уровне байтов то, на что указывают указатели в strv =/.
i
иj
в ноль (0) при каждой итерации и последующую вопиющую перезапись ранее сохраненных данных после этого? Забудьте код и заявите следующее. Что вы пытаетесь сделать? Сделать сетку из динамических строк, где каждая ячейка — это char*, каждая строка — это char*[], а вся сетка — это char **[]? - person WhozCraig   schedule 19.04.2013i
будет индексом последней записи, добавленной кstrv
. Посколькуi
равно нулю, ноль умножить на что-либо равно нулю, и memcpy ничего не копирует.i
здесь должно быть количество копируемых элементов. - person luser droog   schedule 19.04.2013