如何取消引用strlen内部的void指针?

One*_*Arb 1 c pointers dereference

我编写了一个不可知函数,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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么以下代码无法编译?

void print_char2hex(const void *cp) {

    size_t i;

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

这是错误消息:

passing argument 1 of strlen makes pointer from integer without a cast [-Wint-conversion]
Run Code Online (Sandbox Code Playgroud)

klu*_*utt 6

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++) {
Run Code Online (Sandbox Code Playgroud)

如果您问我,它也看起来更清晰。