在 char 数组上使用 'free' 时出错
Error using 'free' on char array
我是 C 的新手,正在尝试用它编写命令行程序。我正试图在程序终止之前释放一个 char 数组。但是当它到达 free
命令时,我遇到了 "debug assertion failed" 运行 时间错误。在到达那个点之前,程序会删除该数组中的字符,直到第一个空格。我在数组上使用递增技术,因为我读到这是一种从数组中逐个删除字符的方法。这是那段代码:
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] == '[=11=]')
break;
command[i] = input[i];
}
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
command[i] = '[=11=]'; //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] = '[=12=]';
return input;
}
所以在程序的其余部分结束后,我希望能够释放在 getInput()
函数中分配的内存。我在想 input
返回到 char 指针的方式搞砸了。但我不确定如何解决它。感谢任何帮助。
问题是最有可能这两行:
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
在这里您修改 指针,使您失去应传递给free
的原始指针。您需要将原始指针保存在一个临时变量中,并将其传递给 free
.
你得到一个错误,因为你正在修改这里的 input
指针:
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
此操作后,input
不再指向由malloc
分配的内存的开始。从而给你错误。相反,将 input
复制到另一个指针变量。
此外,请考虑在 getInput()
之外进行分配,因为如果可能的话,在同一个函数中分配和释放内存被认为是一种很好的做法。
您还没有发布调用 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);
我是 C 的新手,正在尝试用它编写命令行程序。我正试图在程序终止之前释放一个 char 数组。但是当它到达 free
命令时,我遇到了 "debug assertion failed" 运行 时间错误。在到达那个点之前,程序会删除该数组中的字符,直到第一个空格。我在数组上使用递增技术,因为我读到这是一种从数组中逐个删除字符的方法。这是那段代码:
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] == '[=11=]')
break;
command[i] = input[i];
}
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
command[i] = '[=11=]'; //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] = '[=12=]';
return input;
}
所以在程序的其余部分结束后,我希望能够释放在 getInput()
函数中分配的内存。我在想 input
返回到 char 指针的方式搞砸了。但我不确定如何解决它。感谢任何帮助。
问题是最有可能这两行:
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
在这里您修改 指针,使您失去应传递给free
的原始指针。您需要将原始指针保存在一个临时变量中,并将其传递给 free
.
你得到一个错误,因为你正在修改这里的 input
指针:
for (j = 0; j <= i; j++) //removes command and space and leaves parameters
input++;
此操作后,input
不再指向由malloc
分配的内存的开始。从而给你错误。相反,将 input
复制到另一个指针变量。
此外,请考虑在 getInput()
之外进行分配,因为如果可能的话,在同一个函数中分配和释放内存被认为是一种很好的做法。
您还没有发布调用 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);