2009-07-26 37 views
6

Đã một thời gian kể từ khi tôi nhầm lẫn với mã C.Hội tụ không hợp lệ từ khoảng trống * sang char **

Tôi gặp phải lỗi sau khi biên dịch mã C trong Ubuntu bằng gcc.

Lệnh Tôi đang sử dụng để biên dịch mã là (nếu những sai sót này vì trình biên dịch Tôi đang sử dụng, xin vui lòng cho tôi biết làm thế nào để làm điều đó đi):

gcc -o runnable mycode.C 

error: invalid conversion from ‘void*’ to ‘char**’

Dòng 39 là :

sequence=malloc(sizeof(char *)*seqNum); 

chuỗi được khai báo là:

char **sequence; 

SEQNUM được khai báo là:

int seqNum 
+10

Đổi tên tệp của bạn để tiện ích là chữ thường "c". GCC quyết định ngôn ngữ bạn đang sử dụng từ phần mở rộng, và vì một lý do nào đó vốn “C” có nghĩa là C++. –

+0

cảm ơn! đã làm việc! –

+0

Ah. Tín dụng ở đây nên đi đến sgm. Điều này là chính xác. – dmckee

Trả lời

7

Đã thêm: Giải pháp nhịn ăn cho vấn đề thực tế của Arron được cung cấp bởi sgm trong nhận xét. Các văn bản dưới đây là tất cả chính xác, và hy vọng hữu ích, nhưng một giải pháp tỷ lệ thứ hai cho vấn đề ở bàn tay.


trình biên dịch của bạn đang được rất cứng cổ về dàn diễn viên con trỏ (bạn đang sử dụng một trình biên dịch C++?), Thêm một diễn viên rõ ràng như

sequence=(char**)malloc(sizeof(char *)*seqNum); 

nên lỗi đi. Hoặc bạn có thể có thể để thuyết phục các trình biên dịch để đi dễ dàng cho bạn với một số loại tùy chọn như

$(CC) --lighten-up-baby code.c 

mà có thể là thích hợp hơn nếu điều này là trong một số mã của bên thứ ba mà bạn không thực sự muốn hack. Đọc tài liệu biên dịch của bạn để tìm tùy chọn bạn muốn. Vì tất cả các gcc s tôi có trong tay (phiên bản 4.0 và 4.2) đều hài lòng với mã đó, tôi không ở nơi tốt để đưa ra lời khuyên về các công tắc để tắt hành vi này.

+2

+1 chính xác. C trình biên dịch không phàn nàn nhưng trình biên dịch C++ nên. –

+0

Các trình biên dịch C99 có tính chọn lọc hơn so với các trình biên dịch C89 bao giờ, và gcc có thể được thêm vào bằng các công tắc như -pantic –

+0

Tôi đang sử dụng gcc -o để biên dịch mã trên ubuntu. những gì bạn đề cập đã khiến lỗi đó biến mất. Nhưng bây giờ tôi đang nhận được cùng một lỗi trên dòng này cho (i = 0; i

5

Bạn cần phải đúc kết quả của malloc là loại mà bạn muốn.

Vì vậy:

 
char **sequence; 
... 
sequence = (char **)malloc(sizeof(char *) * seqNum); 

Cũng nên nhớ rằng nếu bạn đang sử dụng chuỗi bạn sẽ cần phải phân bổ một danh sách các "char *" s như bạn đã làm nhưng sau đó bạn không có bộ nhớ chỉ định được cấp phát, nó chỉ phân bổ không gian cho danh sách các con trỏ.

Một phần lý do cho việc này là lỗi là việc chỉ định giữa các loại con trỏ khác nhau có thể thay đổi căn chỉnh bắt buộc. Malloc được đảm bảo trả về một con trỏ tới không gian với sự liên kết phù hợp với mọi loại.

+2

Điều đó chỉ áp dụng cho C++. Người đăng tin tin rằng anh ta đang viết một ứng dụng C, vốn ít nghiêm ngặt hơn. –

+0

Ah vâng, chỉ thấy rằng trong nhận xét về câu trả lời. Nó vẫn là thực hành tốt để đúc kết quả của malloc trong C, tâm :) –

+7

Vâng, không, nó không phải là. –

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