2013-03-08 37 views
14

Xin chào tất cả Tôi muốn thực hiện gỡ lỗi với printf. Nhưng tôi không biết cách in biến "out".In biến void * trong C

Trước khi trở về, tôi muốn in giá trị này, nhưng loại của nó bị vô hiệu *.

int 
hexstr2raw(char *in, void *out) { 
    char c; 
    uint32_t i = 0; 
    uint8_t *b = (uint8_t*) out; 
    while ((c = in[i]) != '\0') { 
     uint8_t v; 
     if (c >= '0' && c <= '9') { 
      v = c - '0'; 
     } else if (c >= 'A' && c <= 'F') { 
      v = 10 + c - 'A'; 
     } else if (c >= 'a' || c <= 'f') { 
      v = 10 + c - 'a'; 
     } else { 
      return -1; 
     } 
     if (i%2 == 0) { 
      b[i/2] = (v << 4); 
      printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);} 
     else { 
      b[i/2] |= v; 
      printf("c='%c' \t v='%u' \t b[i/2]='%u' \t i='%u'\n", c,v ,b[i/2], i);} 
     i++; 
    } 
    printf("%s\n", out); 
    return i; 
} 

Tôi làm cách nào? Cảm ơn.

+1

Bạn mong muốn 'out' trỏ đến loại dữ liệu nào? – Nick

+1

Bạn có thực sự muốn in chính giá trị con trỏ không? Xem xét mã nào, có vẻ như bạn muốn in kết quả, tức là các byte được tạo. Xem câu trả lời của tôi về cách làm điều đó. :) – unwind

Trả lời

12

này:

uint8_t *b = (uint8_t*) out; 

ngụ ý rằng out là trong thực tế, một con trỏ đến uint8_t, vì vậy có lẽ bạn muốn in các dữ liệu đó là thực sự ở đó. Cũng lưu ý rằng bạn không cần phải truyền từ void * trong C, do đó, diễn viên thực sự là vô nghĩa.

Mã dường như đang chuyển đổi hex sang chuyển đổi nhị phân, lưu trữ kết quả tại out. Bạn có thể in các i byte được tạo ra bằng cách thực hiện:

int j; 
for(j = 0; j < i; ++j) 
    printf("%02x\n", ((uint8_t*) out)[j]); 

Giá trị con trỏ chính nó là hiếm khi thú vị, nhưng bạn có thể in nó với printf("%p\n", out);. Trình định dạng định dạng %p là dành cho void *.

+2

'uint8 *' có phải là 'uint8_t' trong dòng' printf' của bạn không? – MrPickles

36
printf("%p\n", out); 

là cách chính xác để in con trỏ (void*).

+2

Nếu bạn muốn in giá trị chứ không phải con trỏ, hãy xem câu trả lời của thư giãn. –

+0

Tôi lưu trữ một chuỗi ký tự không đổi trong khoảng trống * và sử dụng% p% nó không in chuỗi nhưng dường như là địa chỉ của chuỗi – Mushy

6

Trình định dạng định dạng để in con trỏ void sử dụng printf trong C là %p. Những gì thường được in là một biểu diễn hệ thập lục phân của con trỏ (mặc dù tiêu chuẩn nói đơn giản rằng nó là một chuỗi ký tự được định nghĩa thực hiện xác định một con trỏ).

+0

Về mặt kỹ thuật, tùy thuộc vào việc triển khai để chọn "nội dung được in" nhưng Tôi đã không bao giờ thực sự nhìn thấy bất cứ điều gì khác hơn là một số hex đơn giản (mặc dù tin đồn về AS/400s). :-) – torek

+0

@torek Bạn nói đúng, tiêu chuẩn nói rằng nó được thực hiện xác định. Tất cả các triển khai mà tôi đã thấy, cho đến nay đã quyết định sử dụng hex, mặc dù :) – dasblinkenlight

+0

@ dasblinkenlight Xin chào, tôi hơi muộn ở đây, nhưng hy vọng sẽ hỏi bạn: Tôi đã thấy từ đâu đó rằng printf ("% p \ n", ptr); nên là printf ("% p \ n", (void *) ptr); nếu không chúng tôi sẽ nhận được hành vi không xác định, có đúng không? Nếu vậy, tại sao? Cảm ơn trước. – Unheilig