C - Динамическое выделение памяти - копировать строку - PullRequest
0 голосов
/ 05 марта 2019

для следующей программы

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int size = 16, len = 0, c;
  char* data = (char*)malloc(sizeof(char) * size);
  while((c = getchar()) != EOF) {
    if(len == size) {
      size *= 2;
      char* data_new = (char*)realloc(data, sizeof(char) * size);
      if(data_new == NULL) {
        free(data);
        return -1;
      }
      if(data_new != data) {
        memcpy(data_new, data, size);
        data = data_new;
      }
    }
    data[len] = c;
    len++;
  }
  data[len] = '0';
  printf("%s\n", data);
  free(data);
  return 0;
}

Я думаю, что ошибка заключается в части realloc, потому что, если я устанавливаю размер int высокий, все работает нормально.

Есть ли у кого-нибудь совет для меня, как я могу правильно сделать эту вещь realloc?

спасибо за вашу поддержку

1 Ответ

1 голос
/ 05 марта 2019

Вам не нужно копировать данные, когда realloc возвращает другой указатель - это сделано для вас.На самом деле это ошибка , потому что вы копируете данные из источника, которого больше не существует, и вдвое больше, чем было!Таким образом, вам нужно только

data = data_new;

Также эта строка неправильна

data[len] = '0';

, она должна быть

data[len] = '\0';

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

if(len == size - 1) {
    // . . . 
}

Примечание такжечто если вы вводите символы, каждый из которых разделен символом новой строки, то getchar() будет читать и каждую новую строку.

...