临时指针:正确的malloc和免费

时间:2018-10-24 15:02:24

标签: c pointers malloc free

我的想法是在函数的开头声明一个char * temp指针,该指针可以反复使用。

首先,我从一开始就使用malloc,在最后使用free()。问题是我复制到temp的第一个字符串是所有字符串中最长的。因此,当我打印第一个字符串之后的字符串时,第一个字符串的结尾仍然存在: 例如。 第一个字符串是“ hello”,第二个字符串是“ no” ->我将temp写入了FILE,结果为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 :(得分:4)

当您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以及关联的mallocfree的呼叫。

答案 1 :(得分:1)

您可能想在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);

希望它对您有帮助!

编辑:

我知道OP已经解决,这只是另一个可能的解决方案。