Редактировать: Согласно комментариям, если исходный массив cstrings не был выделен с достаточным объемом памяти на строку, то, вероятно, лучшее решение состоит в том, чтобы создать еще один пустой массив с двойной выделенной памятью на строку и скопировать старый массив вновый пустой следующий:
int count = 500;
int temp_size = 0;
char** new_array = malloc(count * sizeof(char*));
for(int i = 0; i < count; i++) {
temp_size = strlen(output[i]);
new_array[i] = malloc(((temp_size * 2) + 2) * sizeof(char)));
strcpy(new_array[i], output[i]);
}
Динамически создать массив строк с помощью malloc
Можно избежать многих проблем, объявив переменные внутри цикла for, тогда их время жизни и область действия ограничены циклом for. В вашем случае, я думаю, что это работает (см. Комментарии и изменения):
int size = 0;
for (j = 1; j < count; j++) {
size = strlen(output[j]); //get the size of output[j]
char doubled[(size * 2) + 1]; //make cstring twice size + space for '\0'
strcpy(doubled, output[j]); //put one copy in the temporary buffer
strcat(doubled, output[j]); //concatenate next copy like this
for (k = 0; k < j; k++) {
if (strcmp(output[k], output[j]) == 0) {
strcpy(new_array[j], doubled); //make changes to new_array
}
if (strcmp(new_array[k], doubled) == 0) {
char deleted[1] = "\0"; //needed for free to work
strcpy(new_array[j], deleted); //otherwise runtime error
}
}
}
Объявление переменных внутри циклов, хорошая практика или плохая практика?
Когда сделано сnew_array
, его также необходимо удалить:
for (int i = 0; i < count, i++) {
free(new_array[i]);
}
free(new_array);
new_array = NULL;