用户会将字符指针传递给我的函数printString()
,在将其打印到屏幕或处理字符串之前,我需要检查它是否有效
void printString(char *str)
{
print("%s",str); // in this case it will print grabage
}
void main()
{
char temp[100];
printString(temp);
}
我需要的解决方案是:
void printString(char *str)
{
if str is valid:
print("%s",str);
else
{
str[0] = '\0'; //or using memset() make it valid
print("%s",str);
}
}
你不能这样做。
你可以判断一个char*
值是否是一个空指针,但是如果它是非空的,你就无法判断它是否是一个有效的指针。您当然不能轻便地这样做;您可能也不能以不可移植的方式做到这一点。
例如:
char *ptr = malloc(6);
strcpy(ptr, "hello");
// now ptr points to a valid string
free(ptr);
// now ptr doesn't point to a valid string -- but there's no way to test it
如果您碰巧知道指针是有效的(或者是有效的或空的),您仍然无法做到。例如:
char buf[5] = "hello"; // not a string, since there's no '\0'
char *ptr = buf; // ptr points to valid data, but it's not a string
您可以从 *ptr
开始扫描内存以查找 '\0'
字符串终止符,但您不知道何时停止查找。在这种情况下,您可能会查看 5 个字节的内存,但找不到 '\0'
——但是如果 ptr
指向一个 1000 个字符长的有效字符串怎么办?
在这种情况下,完全有可能在数组之后恰好有一个 '\0'
字节,这可能使 ptr
看起来像是指向一个有效的字符串。 (访问第 6 个字节具有未定义的行为。未定义行为的最坏后果是它可能看起来“有效”,这意味着更难以追踪错误。)
确定指针是否指向有效字符串的唯一方法是以保证指向有效字符串的方式编写代码。如果不是,则不是您可以在问题发生后检测到的问题。