2011-02-24 98 views
40

Tôi đang gặp rắc rối với các mã dưới đây với các lỗi trên dòng 5:chuyển đổi không hợp lệ từ `void * 'sang` char *' khi sử dụng malloc?

error: invalid conversion from void* to char*

Tôi đang sử dụng g ++ với CodeBlocks và tôi đã cố gắng để biên dịch tập tin này như một file cpp. Nó có quan trọng không?

#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"); 
} 
+2

Có, điều đó quan trọng. Xem http://david.tribble.com/text/cdiffs.htm#C99-void-ptr. –

+25

Xin lỗi trước vì đã la hét, nhưng ** KHÔNG CẬP NHẬT C AS C++ **. Họ không phải là cùng một ngôn ngữ. –

+1

Câu hỏi này được gắn thẻ cả 'c' và' C++ '. Vui lòng chọn một thẻ, sau đó xóa thẻ khác. –

Trả lời

76

Trong C++, bạn cần phải cast sự trở lại của malloc()

char *foo = (char*)malloc(1); 
+27

Trong C++ bạn làm, không phải trong C. – Marlon

+2

Nếu bạn đang viết mã C (và bạn đang có), thì hãy sử dụng phần mở rộng .c cho tên tệp và bạn sẽ tốt. – karlphillip

+0

cảm ơn mọi người, tôi sẽ kiểm tra điều này như câu trả lời trong 12 phút. – pandoragami

4

Tôi giả định này là phù hợp với malloc. Chỉ cần đúc kết quả sau đó - char *foo = (char*)...

20

C++ được thiết kế để trở nên an toàn hơn loại C, do đó bạn có thể không (tự động) chuyển đổi từvoid*- một loại con trỏ. Vì tệp của bạn là .cpp, trình biên dịch của bạn đang chờ mã C++ và, như đã đề cập trước đó, lệnh gọi của bạn tới malloc sẽ không biên dịch vì bạn đang gán một char* cho một số void*.

Nếu bạn thay đổi tệp thành .c thì nó sẽ mong đợi mã C. Trong C, bạn không cần phải chỉ định một diễn viên giữa void* và một loại con trỏ khác. Nếu bạn thay đổi tệp thành .c, tệp sẽ biên dịch thành công.

4

Vì vậy, ý định của bạn là gì? Bạn đang cố gắng viết chương trình C hoặc chương trình C++?

Nếu bạn cần một chương trình C, sau đó không biên dịch nó dưới dạng C++, tức là không cung cấp đuôi tệp ".cpp" hoặc yêu cầu trình biên dịch xử lý tệp của bạn dưới dạng C. Trong ngôn ngữ C bạn nên không đúc kết quả của malloc. Tôi cho rằng đây là những gì bạn cần kể từ khi bạn gắn thẻ câu hỏi của mình là [C].

Nếu bạn cần một chương trình C++ sử dụng malloc, thì bạn không có lựa chọn nào khác ngoài việc đặt giá trị trả lại là malloc cho đúng loại.

Các vấn đề liên quan