我是C的新手,并尝试用它编写命令行程序。我试图在程序终止之前释放一个char数组。但我得到了一个"调试断言失败"到达free
命令时出现运行时错误。在它到达那一点之前,程序正在删除该数组中的字符,直到第一个空格。我在数组上使用递增技术,因为我读到这是一种从数组中逐个删除字符的方法。这是一段代码:
char command[140];
char * input = getInput(); //prompt function for user input
//get string up to first whitespace to separate the command and its parameters
for (i = 0; i < strlen(input); i++)
{
if (input[i] == ' ' || input[i] == '\0')
break;
command[i] = input[i];
}
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
command[i] = '\0'; //null terminate char array
numParams = getNumParams(input);
free(input); //should've added this line earlier to avoid confusion.
我的getInput()
函数执行此操作:
char * getInput()
{
int n, size = 260;
char * input = (char*)malloc(size);
if (!input) //make sure memory allocation worked
return NULL;
do
{
printf("cmd> "); //prompt
fgets(input, 256, stdin); //get user input/commands
n = strlen(input);
} while (n <= 1);
if (input[n - 1] == '\n') //remove new line from input array
input[n - 1] = '\0';
return input;
}
因此,在程序的其余部分结束后,我希望能够释放getInput()
函数中分配的内存。我正在思考我input
返回char指针的方式正在弄乱它。但我不确定如何解决它。任何帮助表示赞赏。
答案 0 :(得分:4)
您尚未发布调用free
的行。我假设你在打电话:
free(input);
我明白为什么会出现问题。
您正在更改行中的input
值:
for (j = 0; j <= i; j++)
input++;
当您致电free
时,指针的值必须是malloc
,calloc
或realloc
返回的值。如果您使用任何其他指针值,程序将受到未定义的行为。
确保保留已返回的值,以便您可以使用它来调用free
。
char* input = getInput();
char* saved_ptr = input;
// ...
// Change input
// ...
// Deallocate memory using the original pointer
free(saved_ptr);
答案 1 :(得分:3)
问题是很可能这两行:
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
在这里你修改指针,使你松开你应该传递给free
的原始指针。您需要将原始指针保存在临时变量中,并将其传递给free
。
答案 2 :(得分:3)
您收到错误,因为您正在修改input
指针:
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
执行此操作后,input
不再指向由malloc
分配的内存开始。从而给你错误。而是将input
复制到另一个指针变量。
另外,考虑在getInput()
之外进行分配,因为如果可能的话,在同一个函数中分配和释放内存被认为是一种很好的做法。