我的想法是在函数的开头声明一个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输出正常工作,而输出文件不正常。
答案 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
以及关联的malloc
和free
的呼叫。
答案 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已经解决,这只是另一个可能的解决方案。