2011-07-04 31 views
6

Tôi đang viết một thông dịch viên và tôi muốn có thể lưu trữ bất kỳ giá trị nào mà hàm trả về thành con trỏ trống. Tôi đã không có vấn đề lưu trữ ints và con trỏ khác nhau như con trỏ void nhưng tôi nhận được một lỗi khi cố gắng để đúc một đôi như là một con trỏ void. Tôi hiểu rằng đôi khi được lưu trữ khác với số nguyên và con trỏ ở mức bit, nhưng tôi không hiểu tại sao tôi không thể đặt bất kỳ bit nào tôi muốn vào con trỏ (giả sử nó có đủ bộ nhớ được cấp phát) và sau đó đưa chúng ra sau, đúc chúng như là một đôi.Chuyển đổi gấp đôi thành void * trong C

Có thể truyền con trỏ gấp đôi sang con trỏ trống không bằng cách sử dụng cú pháp mà tôi không biết hoặc tôi hiểu nhầm con trỏ void hoạt động như thế nào?

+4

có bạn xem là sử dụng một 'union' để thay thế? –

+4

Có vẻ như bạn đang làm điều gì đó khủng khiếp sai. Hãy nhìn vào câu trả lời của David. – pmr

+0

kiểm tra câu trả lời của tôi trong câu hỏi khác http://stackoverflow.com/questions/6539023/storing-values-in-union-in-c/6539185#6539185 –

Trả lời

12

Trên nhiều hệ thống, double rộng 8 byte và con trỏ rộng 4 byte. Do đó, cái cũ sẽ không phù hợp với cái sau.

Bạn có vẻ sẽ lạm dụng void*. Giải pháp của bạn sẽ liên quan đến phân bổ dung lượng lưu trữ ít nhất là lớn nhất là loại lớn nhất bạn cần lưu trữ trong một số cấu trúc giống biến thể, ví dụ: a union.

+2

Tôi không thể tin rằng tôi chưa bao giờ nghe nói về một công đoàn trước đây . Điều này thật đúng với gì mà tôi đã tìm kiếm. – Jack

+1

+1 để đề xuất phương pháp tiếp cận chính xác. :) –

2

Tất nhiên có thể truyền. Con trỏ không có điểm là những gì làm cho đa hình có thể trong C. Bạn cần phải biết trước thời gian những gì bạn đang đi đến chức năng của bạn.

void *p_v ; 
double *p_d ; 
p_d = malloc(sizeof(double)) ; 
p_v = (void *) p_d ; 
+0

Ví dụ của bạn dường như hoạt động vì 'p_d' là một con trỏ. Các op đã được hỏi về một con trỏ không để void * chuyển đổi. –

0

Đây là nó

int main () { 
    double d = 1.00e+00 ; // 0x3ff0000000000000 
    double * pd = & d ; 
    void * * p = (void * *) pd ; 
    void * dp = * p ; 
    printf ("%f %p %p %p \n" , d , pd , p , dp) ; 
    return 0 ; 
} ; 

đầu ra

1.000000 0x7fff89a7de80 0x7fff89a7de80 0x3ff0000000000000 

địa chỉ thứ 2 và thứ 3 có thể là khác nhau. Một shortcut

void * dp = * (void * *) & d ; 

Cheers

+0

Đây là hành vi không xác định (vi phạm bí danh nghiêm ngặt) –

+0

@ M.M nó không phải là. Tôi đang đúc con trỏ, tôi biết những gì tôi đang làm, nó không phải là C++, nó biên dịch và đưa ra kết quả đúng. Tôi sẽ không đề nghị sử dụng một kỹ thuật như vậy trong một đoạn mã dài, nhưng tôi nói đúng. – Fabio

+0

Biểu thức '* p' có kiểu' void * 'nhưng đang truy cập bộ nhớ thực sự thuộc loại' double * '. Những người thậm chí có thể có kích thước khác nhau –

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