1

Тема: Проблема з викликом функції realloc

Всім привіт!
Вирішив розібратися з динамічним розподілом пам'яті та написав простеньку програму. Задача її полягає в тому, щоб прибирати зайві пробіли між словами. Ось код:

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


int main()
{
    int n=50, k=0;
    int i=0, j=0;
    FILE *output;
    FILE *input;
    char *ptr;
    char *str1;
    char *str2;
    output = fopen("output.txt","w");
    input = fopen("input.txt","r");
    str1 = (char*)malloc(n*sizeof(char));
    str2 = (char*)malloc(n*sizeof(char));

    while( fscanf(input, "%c", str1+i) != EOF)
    {
        if(*(str1+i) != ' ' )
        {
            *(str2+j) = *(str1+i);
            j++;
            k = 1;
        }
        else if(k == 1)
        {
            *(str2+j) = *(str1+i);
            j++;
            k = 0;
        }
        i++;
    }
    
    free(str1);
    str1 = NULL;

    if(*(str2+j-1) == ' ')
    {
        ptr = (char*) realloc(str2, (j-1) * sizeof(char));
        if(ptr != NULL)    /*Перевірка виділення нової пам'яті*/
            str2 = ptr;    /*Запис адреси нової області пам'яті в вихідний вказівник*/
    }
    else
    {  
        ptr = (char*) realloc(str2, j * sizeof(char));    
        if(ptr != NULL)    
            str2 = ptr;    
    }
    
    
   
    printf("%s", str2);
    fprintf(output, "%s", str2);
     
    
    fclose(input);
    fclose(output);
    getchar();
    return 0;
}    
     

Але при спробі змінити розмір масиву функцією realloc в мене залишається незрозумілий "хвіст".
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=324&amp;download=0&amp;secure_str=3821f6

Якщо ж просто зменшити розмір пам'яті, яка виділяється, то  чомусь звільняється пам'ять не з кінця, а з середини, "хвіст" ж залишається:
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=325&amp;download=0&amp;secure_str=3821f6

Яка можлива проблема і які існують тонкощі використання динамічної пам'яті? Завчасно кажу спасибі!)

Post's attachments

Без імені.png 42.7 kb, 230 downloads since 2013-12-23 

2

Re: Проблема з викликом функції realloc

Як щодо зафейленого null-термінатора в кінці рядка? (може воно його відгризає)

Подякували: breter1

3 Востаннє редагувалося koala (23.12.2013 07:10:28)

Re: Проблема з викликом функції realloc

По вашій проблемі - ви забуваєте додати нульовий байт в кінець рядка, тому дебагер і printf, що розглядають char *ptr як рядок із '\0' на кінці, а не масив визначеної довжини, прихоплюють область за його кінцем.
Пара порад: для читання одного символу є fgetc, а str[ j ] виглядає простіше за *(str2 + j) - при тому, що робить те саме.

Подякували: breter1

4

Re: Проблема з викликом функції realloc

Спасибі, розібрався)