请帮助我查找动态内存分配中的错误。
有必要把所有以一个字母开头和结尾的单词都打印出来。
该算法适用于静态数组,但在尝试创建动态数组时出错。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int len = 0;
char str[10] = "aba cd geg ";
char* word = NULL;
int j = 0;
int i = 0;
int n = 0;
while(str[i]!=' ')
{
if(!isspace(str[i]))
{
n++;
word = (char*)realloc(word, (n* sizeof(char)));
word[j] = str[i];
j++;
len++;
}
else
{
if(word[0] == word[len-1])
{
j = 0;
while(j < len)
{
printf("%c", word[j]);
j++;
}
}
j = 0;
len = 0;
free(word);
n = 0;
}
i++;
}
return 0;
}
释放word
后,需要将word
设置为NULL
,因为realloc
只能在NULL指针或之前由malloc
、calloc
或realloc
返回的有效指针上执行。
...
len = 0;
free(word); // after this line, word is no more a valid pointer
word = NULL; // <<<< insert this
n = 0;
...
换句话说,这种模式总是错误的:
free(foobar);
foobar = realloc(foobar, ...);
另一种可能性是根本不释放word
,让下一个realloc
来处理它,在这种情况下,这很可能更有效。
...
len = 0;
// free(word); remove this line
n = 0;
...
但是您需要在程序结束时调用free(word);
,就在return 0;
之前
所以你的程序的结尾会是这样的:
...
j = 0;
len = 0;
n = 0;
}
i++;
}
free(word);
return 0;