簡體   English   中英

如何確定 unsigned char* 的長度?

[英]How do you determine the length of an unsigned char*?

如何確定 unsigned char* 的長度?

對於指針的實際大小:

size_t s = sizeof(unsigned char*);

如果你想要字符串的長度:

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

這可能有兩種含義。 你只是想知道指針類型有多大? 如果是這樣,那么喬斯的答案是正確的

size_t size = sizeof(unsigned char*);

如果您想知道指針指向多少個元素,那就有點復雜了。 如果這是一個 C 風格的字符串,那么 strlen 或一些變體是你最好的選擇。

但是,如果這只是一個指向與 C 樣式字符串無關的 unsigned char 的指針,則無法可靠地實現您正在尋找的內容。 C/C++ 不會將長度字段與指針相關聯。 您需要將長度與指針一起傳遞,或者使用類似 vector 的類來存儲指針和長度。

在理想的世界中,您不會。 您將 char* 用於 C 樣式字符串(它們以 NUL 結尾,您可以測量其長度),而 unsigned char* 僅用於字節數據(它的長度在另一個參數或其他參數中,您可能會遇到盡快使用 STL 容器,例如vector<unsigned char>basic_string<unsigned char> )。

根本問題是您無法對 char 和 unsigned char 的存儲表示是否相同做出可移植的假設。 他們通常是,但他們被允許不是。 因此,沒有類似字符串的庫函數可以對 unsigned char* 進行操作,僅對 char* 進行操作,並且將 unsigned char* 轉換為有符號 char* 並將結果視為字符串通常是不安全的。 由於 char 可能是有符號的,這意味着不會將 unsigned char* 轉換為 char*。

但是,0 在 unsigned char 和 char 中始終是相同的值表示。 所以在一個非理想的世界中,如果你從某個地方得到了一個 C 風格的字符串,但它是作為一個 unsigned char* 到達的,那么你 (a) 將它轉換為 char* 並繼續使用它,而且 (b ) 找出是誰對你做了這件事,並請他們停下來。

如果您使用的是 C++,並且它是一個 unsigned char* 中的字符串,那么在操作它之前最好先將它放入 std::string 中。 這樣你就可以對它做各種各樣的事情,並且仍然可以隨時獲得它的 length() 和/或 capacity() 。

我假設您正在對所述數組進行操作以使其大小非常規。 如果你只是分配、設置和忘記,你總是可以將數組的實際分配大小存儲在一個單獨的變量中——或者更好的是,創建一個結構/類。

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

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

任何比這更復雜的事情,你就會重新發明 std::string。

如果用c 代碼編譯, strlen()函數參數可以處理“unsigned char*”; 但在 C++ 代碼中,參數不能處理"unsigned char*"; 所以如果你在 C++ 代碼編譯需要強制翻譯(unsigned char*)str.

unsigned char s[] = "示例字符串";

int len = sizeof(s);

你想要指針的長度嗎,這將是一個int。 如果您想要被指向的字符串的長度,請使用 strlen:例如指針的大小:sizeof(unsigned char*) 字符串的大小:strlen(unsigned char*) 多字節字符將被報告為 ..multi byte

通過 unsigned char * 我想你的意思是位於該指針處的字符串。 在這種情況下,它將是:

strlen(your_string_pointer)

但是,這只會找到 \\0 位置。 沒有保證這是實際分配的內存塊大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM