Обрабатывать пустую функцию как значение - PullRequest
2 голосов
/ 18 апреля 2010

Я пишу какой-то ужасный, ужасный код, и мне нужен способ поместить free () в середину оператора. Фактический код:

int main(){
    return printf("%s", isPalindrome(fgets(malloc(1000), 1000, stdin))?"Yes!\n":"No!\n") >= 0;
    // leak 1000 bytes of memory
}

Я использовал alloca (), но я не уверен, что это действительно сработает на моем целевом компьютере. Моя проблема в том, что free возвращает void, поэтому мой код содержит следующее сообщение об ошибке:

error: void value not ignored as it ought to be

Очевидная идея, которая у меня была:

int myfree(char *p){
    free(p);
    return 0;
}

Что приятно, так как делает код еще более нечитаемым, но я бы предпочел не добавлять другую функцию.

Я также кратко попытался трактовать free() как указатель на функцию, но я не знаю, сработает ли это, и я недостаточно знаю о C, чтобы сделать это правильно.

Примечание: я знаю, что это ужасная идея. Не пытайтесь делать это дома, дети.

РЕДАКТИРОВАТЬ: Большое спасибо, ребята, я получил это, изменив мою однострочную isPalindrome() функцию на это:

return (...)?(calls == 1?free(pLeft),1:1):(calls == 1?free(pLeft),0:0);

(вызовы отслеживают глубину рекурсии)

Нет больше утечек памяти!

Ответы [ 4 ]

10 голосов
/ 18 апреля 2010

Я не совсем понимаю, где вы собираетесь это использовать, но если вам нужно выражение, которое освобождает указатель p в качестве побочного эффекта и возвращает значение 0, тогда вы можете просто использовать это.

(free(p), 0)
3 голосов
/ 18 апреля 2010

Оператор запятой, может быть?

char *buf;
printf("%s", isPalindrome(fgets(buf = malloc(1000), 1000, stdin))? (free(buf), "Yes!\n"):(free(buf), "No!\n") >= 0;

Не уверен, разрешено ли вам использовать переменную.

Или определите оболочку для isPalindrome, которая освобождает свой параметр:

printf("%s", isPalindrome_free(fgets(buf = malloc(1000), 1000, stdin))? "Yes!\n":"No!\n")) >= 0;
1 голос
/ 18 апреля 2010

Вы можете использовать оператор , для объединения вызовов функций, т. Е .:

int main(){
    return printf("%s", isPalindrome(fgets(malloc(1000), 1000, stdin)) ? 
                 (free(p), "Yes!\n") : (free(p), "No!\n")) >= 0;
}

при условии, что вы сначала назначите выделенное буфо p.

1 голос
/ 18 апреля 2010

Выверните его наизнанку

  1. Выполните printf внутри ур isPalindrome .

  2. Внутри isPalindrome Вызов free () после printf и возврат из функции.

  3. Main () остается однострочным isPalindrome ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...