Вы не можете вернуть указатель на локальную переменную.Как вы решите это, будет зависеть от требуемой семантики.В этом случае объявление magic
static разрешит проблему:
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 )