2012-04-29 31 views
5

Có thể truyền một con trỏ tới một dấu int không, sau đó đưa nó trở lại một con trỏ? Tôi đang cố gắng để lưu trữ con trỏ đến một cấu trúc trong một biến pthread_t, nhưng tôi dường như không thể làm cho nó hoạt động. Dưới đây là một số đoạn mã của tôi (tôi đang tạo thư viện quản lý luồng người dùng cấp). Khi tôi cố gắng in ra tid của chủ đề nó mang lại cho tôi một số số rác dài.Lưu trữ địa chỉ của con trỏ trong một chữ ký không dấu trong C

Chỉnh sửa: Không sao, tôi đã làm việc đó.

tôi đã thay đổi

thread = (pthread_t) currentThread; 

để

*thread = (pthread_t) currentThread; 

đặn nó là một cái gì đó ngu ngốc như thế.


chương trình thử nghiệm:

pthread_t thread1; 
pthread_t thread2; 

pthread_create(&thread1, NULL, runner, NULL); 
pthread_create(&thread2, NULL, runner, NULL); 
pthread_join(&thread2, NULL); 

Thư viện của tôi:

typedef struct queueItem 
{ 
    int tid; 
    ucontext_t context; 

    int caller; 

    struct queueItem *joiningOn; 
    struct queueItem *nextContext; 
} queueItem; 

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg) 
{ 
    thread = (pthread_t) currentThread; 
} 

... 

int pthread_join(pthread_t thread, void **retval) 
{ 
    queueItem *t = (queueItem *) thread; 

    if(runningContext->joiningOn != NULL) // Current thread is already waiting on another 
     return EINVAL; 
    if(t == NULL) // If thread to join on is invalid 
     return 0; 

    fprintf(stdout, "JOINEE: %d\n", t->tid); // Prints weird number 

    runningContext->caller = JOIN; 
    runningContext->joiningOn = t; 
    swapcontext(&(runningContext->context), &scheduleContext); 
} 
+0

Tôi không hiểu - bạn đã xác định pthread_create trong thư viện của riêng bạn? Tại sao làm cho một tên xung đột với chức năng thông thường của tên đó ?? –

+0

Đó là một dự án dành cho trường học. –

+0

Nevermind, làm cho nó hoạt động. Đã chỉnh sửa bài đăng gốc của tôi. –

Trả lời

3

Chắc chắn đó là có thể, nếu bạn chắc chắn int unsigned của bạn là kích thước tương tự như một void * trên hệ thống của bạn.

Nếu bạn có một số mã không hoạt động, hãy đăng nó.

Chỉnh sửa: Bạn nên đọc khoảng intptr_t, ví dụ: tại đây: Why/when to use `intptr_t` for type-casting in C?

+0

Tương tự hoặc cao hơn. + bạn quên về căn chỉnh. –

+0

Chắc chắn, nếu int không dấu lớn hơn, tôi đoán đó là OK. Đối với sự liên kết, bạn có một tình huống cụ thể trong tâm trí mà có thể có vấn đề? –

+1

Cụ thể - không. Nhưng nói chung, các loại POD khác nhau có thể yêu cầu phải có yêu cầu căn chỉnh khác nhau bởi cấu trúc CPU. Điều này không được bao phủ bởi tiêu chuẩn C, vì vậy nếu ngày mai tôi viết CPU của tôi trong Verilog có int unsigned kích thước 64 bit và yêu cầu nó phải được căn chỉnh 16, và sau đó tạo một con trỏ 8 bit yêu cầu nó được căn chỉnh trên 8, có thể dẫn đến foobar :) Tinh thần - nếu bạn không biết, hãy sử dụng 'memcpy'. + pthread_t là loại đục ... –

5

No. Trên nhiều loại con trỏ hệ thống lớn hơn loại int. Nếu bạn có một vấn đề để sử dụng pthread_t, hãy hỏi về nó, int không phải là câu trả lời.

Ví dụ, trên máy tính của tôi, đoạn code sau:

#include <stdio.h> 

int main() { 
     printf("unsigned int = %lu\n", sizeof(unsigned int)); 
     printf("pointer = %lu\n", sizeof(void*)); 
     return 0; 
} 

kết quả đầu ra:

unsigned int = 4 
pointer = 8 
Các vấn đề liên quan