簡體   English   中英

如何取消引用strlen內部的void指針?

[英]How to dereference a void pointer inside strlen?

我編寫了一個不可知函數,以十六進制格式打印char字符串。

void print_char2hex(void* cp) {

    const char *arr = (char *) cp;

    size_t i;

    for(i = 0; i < strlen( arr ); i++) {
        printf("%02X ", 0xFF & arr[i]);
    }
}

為什么以下代碼無法編譯?

void print_char2hex(const void *cp) {

    size_t i;

    for (i = 0; i < strlen( * (const char *) cp ); i++) {
        printf("%02X ", 0xFF & cp[i]);
    }
}

這是錯誤消息:

passing argument 1 of strlen makes pointer from integer without a cast [-Wint-conversion]

strlen需要一個char* 您正在傳遞一個char 通過刪除取消引用更改為: strlen( (const char *) cp )

printf語句中還有一個問題。 您也需要在此處cp 更改為: printf("%02X ",0xFF & ((const char*)cp)[i]);

另一點是,在循環頭中執行strlen函數調用會影響性能。 也許優化器可以修復它,但是要確保最好使用額外的一行。

size_t len = strlen( (const char *) cp );
for(i = 0; i < len ; i++) {

如果您問我,它也看起來更清晰。

如何取消引用strlen內部的void指針?

strlen(const char *) ,不需要取消引用。 只需傳遞cp

void print_char2hex(const void *cp) {
  size_t len = strlen(cp);
  ...

但是不需要strlen()

void print_char2hex(const void *cp) {
  const unsigned char *p = cp;
  while (*p) {
    printf("%02X ", *p++);
  }
}

0xFF &是不必要的,較短的解決方案是:

void print_char2hex(const void *cp) {
  const unsigned char *p = cp;
  while (*p != '\0') {
    printf("%02X ", (const unsigned char) *p++);
  }
}

暫無
暫無

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

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