C: 为什么我会在 free() 上出错
C: Why will I get an error on free()
我编写了以下函数,它将在标有 // 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] != '[=10=]')
{
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] != '[=10=]' && (str[lastPosition] == ' ' || str[lastPosition] == '\n' || str[lastPosition] == '[=10=]'))
{
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);
}
为什么我的代码免费破解?我该如何改进它?
我看到的相关代码是:
char* word = "";
free(word);
您没有分配空字符串 (""
),因此您无法释放它。
你只能free
你malloc
如果您没有分配它,请不要尝试释放它。
P.S. 这是我最好的分配内存的函数列表:
malloc
realloc
calloc
strdup
asprintf
vasprintf
(notably: _not_ alloca)
也许还有其他人?
因为你第一次进入循环时没有分配word。
你只要让它指向不是动态分配的“”。
我的建议是在 while 之前添加初始值为 0 的整数变量:
if (flag != 0) {
free(word);
} else {
word = 1;
}
我编写了以下函数,它将在标有 // 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] != '[=10=]')
{
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] != '[=10=]' && (str[lastPosition] == ' ' || str[lastPosition] == '\n' || str[lastPosition] == '[=10=]'))
{
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);
}
为什么我的代码免费破解?我该如何改进它?
我看到的相关代码是:
char* word = "";
free(word);
您没有分配空字符串 (""
),因此您无法释放它。
你只能free
你malloc
如果您没有分配它,请不要尝试释放它。
P.S. 这是我最好的分配内存的函数列表:
malloc
realloc
calloc
strdup
asprintf
vasprintf
(notably: _not_ alloca)
也许还有其他人?
因为你第一次进入循环时没有分配word。 你只要让它指向不是动态分配的“”。
我的建议是在 while 之前添加初始值为 0 的整数变量:
if (flag != 0) {
free(word);
} else {
word = 1;
}