2015-07-12 5 views
0

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

char *strscan(void) { 
    int size = sizeof(char) * 10; 
    char *a = malloc(size); 

    // Below I try to read character input from the user and store it in the array. 

while (a != EOF) { 

    scanf("%c", a); 
    if (trace) printf("%c", *a); 
    ++a; 
    a = realloc(a, 2 * size); 
} 

    return a; 

} 

На данный момент я все еще получаю переполнение буфера кучи при вводе, например, 15 символов.

ответ

4
++a; 
a = realloc(a, 2 * size); 

В этом проблема. Первый аргумент realloc должен быть указателем, возвращаемым семейными функциями malloc, или нулевым указателем. a раньше был одним, но ++a;, это уже не так.

1

Вам нужны два указателя. Одним из них является расположение буфера. Другой - местоположение текущего символа. Когда разница между ними достаточно велика, перераспределите буфер и сбросьте указатели.

2

Удалить, что ++ a. Это преступник.

realloc() принимает указатель NULL или возвращаемый указатель malloc.

Читайте на странице руководства.

Упование вы понимаете. Happy Coding ..

3

Здесь я вижу две проблемы.

Во-первых, вы увеличиваете a, а затем передаете добавочное значение realloc. Поскольку указатель, переданный в realloc, не был возвращен с malloc, calloc или realloc, или является NULL, это может привести к ошибкам.

Вторая проблема заключается в том, что вы не увеличивая размер вашего буфера памяти после первого вызова realloc, так как вы всегда Попутно 2 * size и size никогда не меняется. Таким образом, вы в конечном итоге пробегаете конец буфера.

Вам нужен отдельный указатель, чтобы отслеживать, куда должен идти следующий символ, и вам нужно отслеживать, насколько велик ваш буфер и realloc, только когда ваш существующий буфер почти заполнен.

char *strscan(void) { 
    size_t size = sizeof(char) * 10; 
    char *a = malloc(size); 
    char *current; // The current character 
    ptrdiff_t diff; 

    current = a; 
    do { 
    scanf("%c", current); 
    if (trace) printf("%c", *current); 
    if (current - a >= size - 1) { 
     size *= 2; 
     diff = current - a; 
     a = realloc(a, size); 
     current = a + diff; // Since "a" could change, we need to modify "current" as well 
    } 
    } while (*current++ != '\n'); 
    *current = '\x0'; 

    return a; 
} 
Смежные вопросы