free()系统消耗的缓冲区()

时间:2013-06-04 11:50:51

标签: c linux raspberry-pi

我在互联网上找不到任何关于的问题。我在Linux Wheezy发行版上运行了一小段C代码(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);
}

现在,我正在从守护程序中运行这段代码。但是当它第二次到达free(fullCommand)时(当我的程序第二次调用函数时),程序崩溃并存在。当我删除free(fullCommand)时,它按预期工作。

我的问题是:系统()已经为我释放了“fullCommand”吗?如果是这样,为什么它第二次而不是第一次工作?我在这里错过了什么吗?

P.S。实际上命令是由几个strcat一起构建的字符串构成的,但上面是最基本形式的代码

2 个答案:

答案 0 :(得分:3)

您有缓冲区溢出,因为您没有为字符串终止符分配空间。

此外,don't cast the return value of malloc(),并在假设分配工作之前检查返回值。

另外,正如您在自己的答案中指出的那样,在新分配的缓冲区上使用strcat()会被破坏,因为缓冲区不是空字符串。很抱歉没有提前解决这个问题。

答案 1 :(得分:-1)

我发现了我的错误:

    // Allocate the command
    char * fullCommand = (char *) malloc(len * sizeof(char));

    // Build the command
    strcat(fullCommand, commandPre);

在malloc之后无法保证fullCommand为空。 strcat将第二个参数的第一个字符放在第一个参数终止符的位置。但是,终止符可能会也可能不会出现在分配的数组的第一个位置,因为malloc之后的内存中的数据是随机的。修复它:

// Allocate the command
char * fullCommand = calloc(len, sizeof(char));

或者,我本可以做到:

// Allocate the command
char * fullCommand = malloc(len * sizeof(char));
fullCommand[0] = '\0';

Al alk Alk在评论中指出,从一个strcpy开始:

// Allocate the command
char * fullCommand = malloc(len * sizeof(char));

// Build the command
strcpy(fullCommand, commandPre);