неправильное преобразование из `void * 'в` char *' при использовании malloc? - PullRequest
53 голосов
/ 24 февраля 2011

У меня проблемы с приведенным ниже кодом с ошибкой в ​​строке 5:

ошибка: неправильное преобразование из void* в char*

Я использую g ++ с кодовыми блоками и пытался скомпилировать этот файл как файл cpp. Имеет ли это значение?

#include <openssl/crypto.h>
int main()
{
    char *foo = malloc(1);
    if (!foo) {
        printf("malloc()");
        exit(1);
    }
    OPENSSL_cleanse(foo, 1);
    printf("cleaned one byte\n");
    OPENSSL_cleanse(foo, 0);
    printf("cleaned zero bytes\n");
}

Ответы [ 4 ]

102 голосов
/ 24 февраля 2011

В C ++ вам необходимо привести значение malloc()

char *foo = (char*)malloc(1);
23 голосов
/ 24 февраля 2011

C ++ разработан для большей безопасности типов, чем C, поэтому вы не можете (автоматически) преобразовать из void* в другой тип указателя.Поскольку ваш файл .cpp, ваш компилятор ожидает код C ++, и, как упоминалось ранее, ваш вызов malloc не будет компилироваться, поскольку вы присваиваете char* для void*.

Если выизмените ваш файл на .c, тогда он будет ожидать кода C.В C вам не нужно указывать приведение между void* и другим типом указателя.Если вы измените файл на .c, он будет успешно скомпилирован.

7 голосов
/ 24 февраля 2011

Я предполагаю, что это строка с malloc. Просто приведите результат - char *foo = (char*)...

5 голосов
/ 24 февраля 2011

Итак, каковы были ваши намерения?Вы пытаетесь написать программу на C или C ++?

Если вам нужна программа на C, не компилируйте ее как C ++, то есть либо не задавайте расширение файла .cpp, либо явно просите компилятор обращаться с вашим файлом как с C. На языке CВы не должны разыгрывать результат malloc.Я предполагаю, что это то, что вам нужно, поскольку вы пометили свой вопрос как [C].

Если вам нужна программа на C ++, использующая malloc, то у вас нет выбора, кроме как явно привести возвращаемое значение malloc до нужного типа.

...