2009-05-07 78 views

Trả lời

21

Đối với kích thước thực tế của con trỏ:

size_t s = sizeof(unsigned char*); 

Nếu bạn muốn chiều dài của chuỗi:

unsigned char* bla = (unsigned char*)"blabla"; 
int s = strlen((char*)bla); 
+5

"blabla" cho ra một chuỗi chỉ đọc, vì vậy bla phải là const unsigned char *. –

+2

Điều này không nên biên dịch. "blabla" là một const char *, và bạn không thể gán một const char * cho một unsigned char * mà không cần casting. –

+0

Đó không phải là nhiệm vụ - nó khởi tạo - được thực hiện mọi lúc. –

-3

By unsigned char * Tôi cho rằng bạn có nghĩa là các chuỗi tọa lạc tại con trỏ đó. Trong trường hợp đó, nó sẽ là:

strlen(your_string_pointer) 

Tuy nhiên, điều này sẽ chỉ tìm vị trí \ 0. Không có garantee đây là kích thước khối bộ nhớ được phân bổ thực tế.

+0

http: //www.cplusplus.com/reference/clibrary/cstring/strlen ... strlen mất một "const char *", không phải là unsigned. – xtofl

8

Có thể có hai ý nghĩa cho điều này. Bạn chỉ muốn biết loại con trỏ lớn như thế nào? Nếu vậy thì câu trả lời của Joce là chính xác

size_t size = sizeof(unsigned char*); 

Nếu bạn muốn biết có bao nhiêu yếu tố con trỏ trỏ đến, phức tạp hơn một chút. Nếu đây là một chuỗi kiểu C thì strlen hoặc một số biến thể là lựa chọn tốt nhất của bạn.

Tuy nhiên, nếu đây chỉ là một con trỏ đến ký tự không dấu có liên quan đến chuỗi kiểu C, thì không có cách nào để đạt được những gì bạn đang tìm kiếm một cách đáng tin cậy. C/C++ không liên kết một trường độ dài với một con trỏ. Bạn sẽ cần phải vượt qua chiều dài xung quanh với con trỏ hoặc sử dụng một lớp như vector lưu trữ cả con trỏ và độ dài.

+1

Bạn đúng về việc không thể lấy lại độ dài được phân bổ - một quyết định thiết kế ngôn ngữ xấu trong mắt của nhiều người. Bạn đang sai về việc có hai ý nghĩa: có thể bạn cần phải biết độ dài của chuỗi có kết thúc bằng 0, mặc dù sẽ tốt hơn nếu sử dụng một ký tự char. Làm cho nó hai-và-một-nửa :) – xtofl

0

Bạn có muốn chiều dài của con trỏ, đó sẽ là một int. Nếu bạn muốn độ dài của chuỗi đang được trỏ đến, hãy sử dụng strlen: ví dụ: Kích thước của con trỏ: sizeof (unsigned char *) Kích thước của chuỗi: strlen (unsigned char *) ký tự nhiều byte sẽ được báo cáo là ..multi byte

+1

Trên thực tế nó wuld là một size_t – Tom

+0

Phải. Tôi nên nói size_t – Rohit

0

Nếu bạn đang sử dụng C++, và một chuỗi của nó trong một unsigned char *, bạn tốt hơn off đầu tiên đặt nó vào một std :: string trước khi thao tác nó. Bằng cách đó bạn có thể làm đủ mọi thứ với nó và vẫn có thể nhận được độ dài() và/hoặc công suất() của nó bất cứ khi nào bạn muốn.

Tôi giả định rằng bạn đang làm những điều để nói mảng để làm cho kích thước của nó không liên tục. Nếu bạn chỉ phân bổ, thiết lập và quên, bạn luôn có thể lưu trữ kích thước phân bổ thực tế của mảng trong một biến riêng biệt - hoặc tốt hơn, tạo một cấu trúc/lớp.

//WARNING: memory issues not addressed here. 
struct myStringStruct 
{ 
    unsigned char * string; 
    int len; 

    allocate(int size) { 
    len = size; 
    string = malloc(sizeof(unsigned char) * len); 
    } 
} 

Bất kỳ phức tạp nào hơn thế và bạn đang phát minh lại std :: string.

6

Trong một thế giới lý tưởng, bạn thì không. Bạn sử dụng char * cho các chuỗi kiểu C (có NUL-terminated và bạn có thể đo chiều dài), và unsigned char * chỉ cho dữ liệu byte (đi kèm với độ dài của nó trong tham số khác hoặc bất kỳ thứ gì) một hộp chứa STL ASAP, chẳng hạn như vector<unsigned char> hoặc basic_string<unsigned char>).

Vấn đề gốc là bạn không thể đưa ra các giả định di động về việc các đại diện lưu trữ của char và unsigned char là như nhau hay không. Họ thường là, nhưng họ không được phép. Vì vậy, không có chức năng thư viện giống như chuỗi hoạt động trên unsigned char *, chỉ trên char *, và nó không phải là nói chung an toàn để đúc unsigned char * để ký char * và xử lý kết quả như là một chuỗi. Vì char có thể được ký, điều này có nghĩa là không có phép đúc unsigned char * đến char *.

Tuy nhiên, 0 luôn có cùng một giá trị đại diện trong unsigned char và char. Vì vậy, trong một thế giới không lý tưởng, nếu bạn có một chuỗi C-style từ đâu đó nhưng nó đã đến như là một unsigned char *, sau đó bạn (a) cast nó để char * và nhận được với nó, nhưng cũng (b) tìm ra ai đã làm điều này cho bạn, và yêu cầu họ vui lòng dừng lại.

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