C语言 如何取消引用 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 中取消引用空指针?

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 != '') {
printf("%02X ", (const unsigned char) *p++);
}
}

相关内容

  • 没有找到相关文章

最新更新