c - 如何检查指针指向 C 中的有效字符串

标签 c

<分区>

用户会将字符指针传递给我的函数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 个字节具有未定义的行为。未定义行为的最坏后果是它可能看起来“有效”,这意味着更难以追踪错误。)

确定指针是否指向有效字符串的唯一方法是以保证指向有效字符串的方式编写代码。如果不是,则不是您可以在问题发生后检测到的问题。

关于c - 如何检查指针指向 C 中的有效字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56471105/

相关文章:

c - else if 和 else {if} 之间的区别

c - 编写仅使用循环和条件语句检查升序的代码

c - C 中的 vector 结构

c++ - -O3(优化级别 3)有什么问题?

c - C 中的 bool 值队列

c - POSIX if.h 是否需要库才能使用

c - C 中的数组大小有限制吗?

c - 带有 objcopy 的巨大二进制文件

c - 在 C 中使用 select() 和 write_fds 时发送数据的正确方法

c - C中的非无意义优化