检查char*指针是否为以null结尾的字符串的便携方法

Siq*_*Lin 5 c string

我有一个C函数,它接受一个char*指针.函数的前提条件之一是指针参数是以空字符结尾的字符串

void foo(char *str) {
    int length = strlen(str);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果str不是指向以null结尾的字符串的指针,则strlen崩溃.是否有一种可移植的方法来确保char*指针确实指向以null结尾的字符串?

我想在用不可读VirtualQuery之后找到最低地址str,如果我们在开头str和那个地址之间没有看到空终止符,那么str就不会指向以空字符结尾的字符串.

Kei*_*son 10

不,没有可移植的方法来做到这一点.以null结尾的字符串可以任意长(最多为SIZE_MAX字节) - 因此可以是非空终止的char数组.带参数的函数无法知道它指向的有效内存块有多大(如果有的话).检查必须遍历内存,直到找到空字符,这意味着如果数组中没有空字符,它将超过它的末尾,从而导致未定义的行为.char*

这就是为什么标准C库函数采用字符串指针作为参数具有未定义的参数行为并不指向字符串.(检查一个NULL指针很容易,但这只会导致一个错误情况,代价是有效参数执行速度较慢.)

编辑:回答你的问题标题:

检查char*指针是否为以null结尾的字符串的便携方法

指针不能是字符串.它可能是也可能不是指向字符串的指针.