Копирование массива
Я пытаюсь прочитать символы из консоли, при этом я не знаю сколько символов я получу. Поэтому я объявляю динамический массив символов и читаю ввод посимвольно. Когда кол-во введенных символов достигает границы массива, я создаю новый массив, копирую в него символы из основного массива, снова объявляю массив с размером вдвое больше и копирую все в него.
void init(void){
// получаем строку цифр разделенных пробелами
char part;
int pos = 0;
int len = 2;
char* array = (char*)malloc(len * sizeof(char));
while (1){
part = (char)getchar();
if (part == '\n') {
break;
}
array[pos] = part;
pos++;
if (pos == len) {
char* buf = (char*)malloc(len * sizeof(char));
for (int i = 0; i < len; ++i){
buf[i] = array[i];
}
int old_len = len;
len = len * 2;
free(array);
char* array = (char*)malloc(len * sizeof(char));
for (int i = 0; i < old_len; ++i){
array[i] = buf[i];
}
free(buf);
}
}
printf("%lu", sizeof(array));
printf("%s", array);
free(array);
// генерируем на основе этой строки массив
// вычисляем сумму четных элементов
// выводим результат
}
Вопросов несколько. Почему printf("%lu", sizeof(array)); всегда выводит 8? И почему когда кол-во символов достигает 16, то новое копирование не срабатывает, т.е. в buf уже ничего не копируется? При этом если я укажу len равным 32, а введенное кол-во символов будет соразмерно, то все хорошо, а если будет хоть на символ больше, то я получу мусор.
Ответы (1 шт):
Почему printf("%lu", sizeof(array)); всегда выводит 8?
Потому что array у вас - указатель на char, а в 64-разрядном приложении размер указателя - 8 байт.
С остальным... Держите код и сами разберитесь, в чем он отличается от вашего.
void init(void)
{
char part;
int pos = 0;
int len = 2;
char* array = (char*)malloc(len * sizeof(char));
while (1){
part = (char)getchar();
if (part == '\n') {
break;
}
array[pos++] = part;
if (pos == len-1)
{
char* buf = (char*)malloc(2*len*sizeof(char));
for (int i = 0; i < pos; ++i)
buf[i] = array[i];
len *= 2;
free(array);
array = buf;
}
}
array[pos] = 0;
printf("%s", array);
free(array);
}
И еще - если уж С, то вот эти приведения - (char*)malloc... - не нужны. Видимо, вы просто дали файлу расширение .cpp, вот он и компилируется как С++.