我正在编写一个代码,该代码应该将 512B 从文件中读取到缓冲区中,然后检查它是否找到了 3 个特定字节以及是否为 true 从 while 循环中断。 我在我的代码早期,当我发现当我使用 free(( 从堆中释放缓冲区内存时,我正在测试每个子部分,我陷入了无限循环。但是我的测试根本不包括缓冲区,当我删除 free(( 然后测试通过并且我退出循环时。但我认为我必须在循环中释放缓冲区,以便在每次传递时我都可以加载新块。我的代码在这里:
// input: read in a card.raw file
// output: 50 jpg images
#include <stdio.h>
#include <stdlib.h>
char* search(char *s);
int main(int argc, char *argv[])
{
// ensure correct usage
if (argc != 2)
{
fprintf(stderr, "Usage --> recover card.rawn");
return 1;
}
// try to open a file for reading
char *infile = argv[1];
FILE *fp = fopen(infile,"r");
if (fp == NULL)
{
fprintf(stderr,"Can't open file: %sn", infile);
}
// read a 512B block process it and
char magicNum[3] = {0xff, 0xd8, 0xff};
char testNum[3] = {0xfa, 0xd8, 0xff};
char *extractMagicNum = testNum;
while (extractMagicNum[0] != magicNum[0] || extractMagicNum[1] != magicNum[1] || extractMagicNum[1] != magicNum[1])
{
char *buffer = malloc(sizeof(char) * 512);
fread(buffer, sizeof(char),512, fp);
// now search buffer for 0xff and when found check next two bytes if magic number break
printf("I am in while loopn");
extractMagicNum = search(buffer);
// used for checking if return value is right
for (int i = 0; i < 3; i++)
{
printf("%i.Element is %in",i,*(extractMagicNum + i));
}
free(buffer);
}
printf("End...n");
// close infile
fclose(fp);
}
// use bisection search to find 0xff and next two bytes
char* search(char *s)
{
char magic[3] = {0xff, 0xd8, 0xff};
char *p = magic;
// just not to get unused error
s++;
s--;
printf("I am in search n");
return p; //return value should satisfie while condition
}
不能返回指向局部变量的指针。 如何解决这个问题将取决于所需的语义。 在这种情况下,声明magic
静态将解决此问题:
char* search(char *s)
{
static char magic[3] = {0xff, 0xd8, 0xff};
char *p = magic;
...
return p; //return value should satisfie while condition
}
但是,如果magic
和s
引用的数据不应更改,则可能首选以下内容:
const char* search( const char* s )
{
static const char magic[3] = {0xff, 0xd8, 0xff};
const char* p = magic;
...
return p;
}
另一个问题是您的 while 循环不比较第三个元素。
while( extractMagicNum[0]va != magicNum[0] ||
extractMagicNum[1] != magicNum[1] ||
extractMagicNum[1] != magicNum[1] ) // << index should be 2 here perhaps?
另请注意,抑制未使用的变量警告的更简单方法是使用自赋值:s = s ;
。 编译器可能会识别该习语,并且不会生成任何代码。
关于malloc
/free
,虽然这些不是问题的直接原因,但通过不断分配和释放不变大小的缓冲区来破坏堆毫无意义。 只需分配一次缓冲区,然后重复使用它:
char *buffer = malloc(512);
while( extractMagicNum[0] != magicNum[0] ||
extractMagicNum[1] != magicNum[1] ||
extractMagicNum[2] != magicNum[2] )
{
...
}
free(buffer);
您可以进一步简化 while 条件,以便:
while( memcmp( extractMagicNum,
magicNum,
sizeof(magicNum) ) !=0 )