Malloc(): Memory Corruption

  • Автор темы PHPMaster
  • Дата начала
P

PHPMaster

#1
Делаю парсер на C

Нужно заменить ascii-коды символов на их эквиваленты

сейчас юзаю:

Код:
char *str_replace(char *str1, char *str2, char *str6)
{
char *str4;
char *str5=malloc(0);

while(strstr(str6, str1)) {
str4 = strstr(str6, str1);
strncpy(str5 + strlen(str5), str6, str4 - str6);
strcat(str5, str2);
str4 += strlen(str1);
str6 = str4;
}
return strcat(str5, str4);
} 

char *htmldecode(char *str)
{
str = str_replace("!", "!", str);
str = str_replace(""", "\"", str);
str = str_replace("#", "#", str);
str = str_replace("$", "$", str);
str = str_replace("%", "%", str);
str = str_replace("&", "&", str);
str = str_replace("'", "'", str);
str = str_replace("(", "(", str);
str = str_replace(")", ")", str);
str = str_replace("*", "*", str);
str = str_replace("+", "+", str);
str = str_replace(",", ",", str);
str = str_replace("-", "-", str);
str = str_replace(".", ".", str);
str = str_replace("/", "/", str);
str = str_replace(":", ":", str);
str = str_replace("&#59,", ";", str);
str = str_replace("<", "<", str);
str = str_replace("=", "=", str);
str = str_replace("&62;", ">", str);
str = str_replace("?", "?", str);
str = str_replace("@", "@", str);
str = str_replace("[", "[", str);
str = str_replace("\", "\\", str);
str = str_replace("]", "]", str);
str = str_replace("^", "^", str);
str = str_replace("_", "_", str);
str = str_replace("`", "`", str);
str = str_replace("{", "{", str);
str = str_replace("|", "|", str);
str = str_replace("}", "}", str);
str = str_replace("~", "~", str);
return (str);
}
Примечание:

str = str_replace("~", "~", str); - в первом аргументе стоит аски код вида (& # 3 7 :rolleyes:, форум их преобразовывает.

При запуске функции вылетает ошибка:

Код:
malloc(): memory corruption: 0x0805eb38 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6[0xb75e1256]
/lib/i686/cmov/libc.so.6(__libc_malloc+0x95)[0xb75e2655]
Как исправить? Может, вобще сделать по-другому? Жду ответов.
 
A

abdyla_v

#2
Код:
char *str_replace(char *str1, char *str2, char *str6)
{
char *str4;
char *str5=malloc(0);

while(strstr(str6, str1)) {
str4 = strstr(str6, str1);
strncpy(str5 + strlen(str5), str6, str4 - str6);
strcat(str5, str2);
str4 += strlen(str1);
str6 = str4;
}
return strcat(str5, str4);
}
Мне кажется что тут написаны страшные вещи. Особенно представим что while ниразу не проработает сразу начинаются загадки с strcat(str5, str4); (так как str4 непонятно на что указывает, а для str5 просто обалдеть выделена память, зачем так выделять? и где free тогда для парности ;) )