Ответ 1
В С++ вам нужно отдать результат malloc()
char *foo = (char*)malloc(1);
У меня возникают проблемы с кодом ниже с ошибкой в строке 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");
}
В С++ вам нужно отдать результат malloc()
char *foo = (char*)malloc(1);
С++ предназначен для более безопасного типа, чем C, поэтому вы не можете (автоматически) конвертировать из void*
в другой тип указателя. Поскольку ваш файл является .cpp
, ваш компилятор ожидает кода на С++, и, как упоминалось ранее, ваш вызов в malloc не будет компилироваться, поскольку вы назначаете char*
в void*
.
Если вы измените файл на .c
, тогда он будет ожидать код C. В C вам не нужно указывать листинг между void*
и другим типом указателя. Если вы измените файл на .c
, он скомпилируется успешно.
Я предполагаю, что это линия с malloc. Просто произведите результат, затем - char *foo = (char*)...
Итак, каковы были ваши намерения? Вы пытаетесь написать программу на C или программу на С++?
Если вам нужна программа на C, тогда не компилируйте ее как С++, то есть либо не предоставляйте расширение файла .cpp, либо явно просите компилятор обрабатывать ваш файл как C. На языке C вы не должны введите результат malloc
. Я предполагаю, что это то, что вам нужно, так как вы отметили свой вопрос как [C].
Если вам нужна программа на С++, которая использует malloc
, тогда у вас нет выбора, кроме как явно передать возвращаемое значение malloc
в соответствующий тип.