一个我在网上找不到的问题。我有一段c代码运行在linux的喘息发行版上(raspberry pi,但这与此无关):
void function(const char * command)
{
// Define commands for in between parameters
char commandPre[] = "echo ";
// Get the lengths of the strings
int len= strlen(command) + strlen(commandPre);
// Allocate the command
char * fullCommand = (char *) malloc(len * sizeof(char));
// Build the command
strcat(fullCommand, commandPre);
strcat(fullCommand, command);
// Execute command
system(fullCommand);
// Free resources
free(fullCommand);
}
现在,我从一个守护程序运行这段代码。但是当它第二次到达FULL(Full命令)(当函数在程序中被调用第二次)时,程序崩溃并存在。当我删除free(fullcommand)时,它会按预期工作。
我的问题是:system()是否已经为我释放了“fullcommand”?如果是,为什么第二次工作而不是第一次?我是不是丢了什么东西?
实际上,p.s.命令是由多个字符串strcat't组合而成的,但上面是最基本形式的代码
最佳答案
您有一个缓冲区溢出,因为您没有为字符串结束符分配空间。
另外,don't cast the return value of malloc()
,并在假设分配工作之前检查返回值。
另外,正如您在自己的答案中指出的那样,在新分配的缓冲区上使用strcat()
会中断,因为缓冲区不会是空字符串。很抱歉没有早点接。