Temp Pointers: исправьте malloc и освободите - PullRequest
0 голосов
/ 24 октября 2018

Моя идея состояла в том, чтобы объявить указатель char * temp в самом начале моей функции, который можно использовать снова и снова.

Сначала я использовал malloc в самом начале и free () всамый конец.Проблема заключалась в том, что первая строка, которую я скопировал в temp, была самой длинной из всех строк.Поэтому, когда я печатал строки, которые следовали за первой, конец первой строки был все еще там: например, первая строка была "привет", следующая была "нет" -> я записал temp в ФАЙЛ, и результат был nollo

Чтобы решить эту проблему, я решил использовать free () каждый раз после того, как записал строку в свой файл, чтобы освободить хранилище для следующей строки.Это вызвало ошибку «ошибка для объекта 0x7fe274801000: освобожденный указатель не был выделен».

Так что ни одна из моих идей не сработала ... Каков наилучший способ справиться с этим?Спасибо !!

void hexdump (FILE *output, char *buffer, int length){
int offset = 0;
int rows = (length%16)==0 ? (length/16) : ((length/16)+1);
char *temp = (char *)malloc(MAX_OUTPUT);

for(int j = 0; j<rows; j++){
    offset = offset + 16;
    sprintf(temp, "%06x : ", offset);
    fwrite(temp, sizeof(char), sizeof(temp), output);
    printf("%06x : ", offset);
    free(temp);
    for(int i = 0; i<16; i++){
        if ((j == rows-1) && (!buffer[i+(j*16)])){
            strcpy(temp,"   ");
            fwrite(temp, sizeof(char), sizeof(temp), output);
            printf("   ");
            free(temp);
        } else {
        sprintf(temp, "%02x ", buffer[i+(j*16)]);
        fwrite(temp, sizeof(char), sizeof(temp), output);
        printf("%02x ", buffer[i+(j*16)]);
        free(temp);
        }
    }
    strcpy(temp, "  ");
    fwrite(temp, sizeof(char), sizeof(temp), output);
    printf("  ");
    free(temp);
    for(int n = 0; n<16; n++){
        if ((j == rows-1) && (!buffer[n+(j*16)])){
            strcpy(temp, " ");
            fwrite(temp, sizeof(char), sizeof(temp), output);
            printf(" ");
            free(temp);
        } else {
                if((buffer[n+(j*16)]>31) && (buffer[n+(j*16)]<127)){
                sprintf(temp, "%c", buffer[n+(j*16)]);
                fwrite(temp, sizeof(char), sizeof(temp), output);
                printf("%c", buffer[n+(j*16)]);
                free(temp);
            } else {
                strcpy(temp, ".");
                fwrite(temp, sizeof(char), sizeof(temp), output);
                printf(".");
                free(temp);
            }
        }
    }
    strcpy(temp, "\n");
    fwrite(temp, sizeof(char), sizeof(temp), output);
    printf("\n");
    free(temp);

}

}

Вывод printf работает правильно, а выходной файл - нет ..

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете использовать realloc() на temp.

char *temp = malloc(size);
//Do some stuff with temp
temp = realloc(temp, newSize);//instead of free(temp);
//Clear the string (fill it with \0) if you want to have a proper new string.
//Do some stuff, and so on until :
free(temp);
//Eventually some more code, WITHOUT using temp
return();

realloc(ptr, val); похоже на free(ptr); ptr = malloc(val);

Надеюсь, это поможет вам!

РЕДАКТИРОВАТЬ:

Я знаю, что ОП уже была решена, это просто еще одно возможное решение.

0 голосов
/ 24 октября 2018

Когда вы free запоминаете, на который указывает указатель, он больше не может использоваться.Вам потребуется снова вызвать malloc, чтобы получить действительный блок памяти.Но даже если вы это сделали, реальная проблема заключается в том, что вы не пишете правильное количество.

Все ваши записи выглядят так:

fwrite(temp, sizeof(char), sizeof(temp), output);

Здесь, sizeof(temp) - это не длина строки, содержащейся в temp, но размер temp, который является указателем и, скорее всего, 4 или 8.

Используйте взамен strlen,которая дает вам длину строки:

fwrite(temp, sizeof(char), strlen(temp), output);

Или еще лучше, просто fprint для записи в файл вместо sprintf, за которым следует fwrite.Например, измените это:

sprintf(temp, "%06x : ", offset);
fwrite(temp, sizeof(char), sizeof(temp), output);

На это:

fprintf(output, "%06x : ", offset);

Тогда вы сможете полностью избавиться от temp и связанных с ним вызовов malloc и free.

...