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

C free()系统()消耗的缓冲区,c,linux,raspberry-pi,C,Linux,Raspberry Pi,这是一个我在网上找不到的问题。我在Linux Wheezy发行版上运行了这段C代码(Raspberry Pi,但这与此无关): 现在,我从一个守护程序运行这段代码。但当它第二次到达空闲(fullCommand)时(当函数在我的程序中第二次被调用时),程序崩溃并存在。当我删除free(fullCommand)时,它会按预期工作 我的问题是:system()是否已经为我释放了“fullCommand”?如果是这样,为什么第二次有效而不是第一次?我是不是遗漏了什么 p.S.实际上,该命令是由几个字符串

这是一个我在网上找不到的问题。我在Linux Wheezy发行版上运行了这段C代码(Raspberry Pi,但这与此无关):

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

我的问题是:system()是否已经为我释放了“fullCommand”?如果是这样,为什么第二次有效而不是第一次?我是不是遗漏了什么


p.S.实际上,该命令是由几个字符串组合而成的,但上面是最基本形式的代码

由于没有为字符串终止符分配空间,因此存在缓冲区溢出

另外,在假设分配有效之前,检查返回值

另外,正如您在自己的回答中指出的,在新分配的缓冲区上使用
strcat()
会被破坏,因为缓冲区不会是空字符串。很抱歉,没有早点拿起它。

我发现了我的错误:

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

    // Build the command
    strcat(fullCommand, commandPre);
不能保证fullCommand在malloc之后为空。strcat将第二个参数的第一个字符放置在第一个参数终止符的位置。但是,由于malloc之后的内存中的数据是随机的,因此终止符可能会也可能不会出现在所分配数组的第一个位置上。通过执行以下操作修复了此问题:

// Allocate the command
char * fullCommand = calloc(len, sizeof(char));
或者,我本可以这样做:

// Allocate the command
char * fullCommand = malloc(len * sizeof(char));
fullCommand[0] = '\0';
或评论中指出的als Alk,从strcpy开始:

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

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

啊,对了,愚蠢的我撞到了头。谢谢我编写C#已经有一段时间了,我完全忘记了终结者。此外,我总是这样投,因为它是快速的,但检查返回值是更好的做法,谢谢提示@“它很快”?(我想你是说,打字)不会比不打字快吧?没有性能差异,而且cast决不会比检查返回值更“糟糕”,这是完全不同的事情。强制转换会很高兴地将NULL转换为字符指针,然后事情就会破裂。或者您可以使用
strcpy()
而不是第一次调用
strcat()
。上一个示例会导致内存泄漏,因为您将
malloc()
返回的地址覆盖为
,从而丢失了该地址。您的意思可能是
fullCommand[0]='\0'
// Allocate the command
char * fullCommand = malloc(len * sizeof(char));

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