我编写了以下函数,该函数将在标有// Breakpoint
的行中断:
char *parseNextWord(char *str)
{
static char *lastStr = "";
static int lastPosition = 0;
if (strcmp(lastStr, str) != 0)
{
lastStr = str;
lastPosition = 0;
}
if (lastPosition > 0 && str[lastPosition - 1] == 0)
{
return 0;
}
char *word = "";
int wLength = 0;
while (str[lastPosition] != ' ' && str[lastPosition] != '\n' && str[lastPosition] != '\0')
{
char *tmp = (char*)malloc(++wLength * sizeof(char));
for (int i = 0; i < sizeof(word); i++)
{
tmp[i] = word[i];
}
tmp[sizeof(*tmp) - 1] = str[lastPosition];
free(word); // Breakpoint
word = (char*)malloc(sizeof(*tmp));
for (int i = 0; i < sizeof(tmp); i++)
{
word[i] = tmp[i];
}
free(tmp); // Breakpoint
lastPosition++;
}
while (str[lastPosition - 1] != '\0' && (str[lastPosition] == ' ' || str[lastPosition] == '\n' || str[lastPosition] == '\0'))
{
lastPosition++;
}
return word;
}
可以像这样调用该函数:
char* string = "Name1 Name2\nName3 Name4\nName1";
int totalCount = 0;
char *nextWord = parseNextWord(string);
while (nextWord != 0)
{
for (int c = 1; c < argc; c++)
{
if (strcmp((const char*)argv[c], nextWord) == 0)
{
totalCount++;
}
}
nextWord = parseNextWord(string);
}
为什么我的代码免费破解?我该如何改进呢?
答案 0 :(得分:3)
我看到的相关代码是:
char* word = "";
free(word);
您没有分配空字符串(""
),因此您无法释放它。
您只能free
malloc
如果您没有分配它,请不要尝试释放它。
<小时/> P.S。这是我分配可以释放的内存的最佳功能列表:
malloc
realloc
calloc
strdup
asprintf
vasprintf
(notably: _not_ alloca)
也许还有其他人?
答案 1 :(得分:0)
因为您在第一次进入循环时没有分配单词。 你只是指出&#34;&#34;这是动态分配的。
我建议让它工作的是在while之前添加整数变量,初始值为0:
if (flag != 0) {
free(word);
} else {
word = 1;
}