Вопрос, который я не мог найти в Интернете. У меня есть этот маленький кусочек C-кода, работающего на дистрибутиве Linux хриплый (Raspberry Pi, но тот не имеет значения):free() буфер, потребляемый системой()
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);
}
Теперь я бегу этот кусок кода из программы-демона. Но когда он достигает свободного (fullCommand) во второй раз (когда функция вызывается во второй раз в моей программе), программа выходит из строя и существует. Когда я удаляю бесплатный (fullCommand), он работает так, как ожидалось.
Мой вопрос: ли система() уже освобождает «fullCommand» для меня? Если да, то почему он работает во второй раз, а не в первый раз? Я что-то упустил?
P.S. Фактически команда состоит из нескольких строк strcat'ed вместе, но выше код в его самой базовой форме
Ах СПРАВА, глупо глупый глупый я * бьет головой *. Благодаря! Я программировал C# какое-то время, и я полностью забыл о терминаторе. Кроме того, я всегда делаю это так, потому что это быстро, но проверка возвращаемого значения - лучшая практика, спасибо за подсказку! – Maarten
@Maarten «Быстро»? Он не может быть быстрее (набирать, я предполагаю, что вы имеете в виду), чем * не * набирать бросок, не так ли? Разница в производительности отсутствует, и приведение не является «хуже», чем проверка возвращаемого значения, это совершенно разные вещи. Приведение будет счастливо преобразовать NULL в указатель символа, а затем все сломается. – unwind