当我们传递一个指向单个char的char*时,%s如何在C中表现

Rub*_*byR 1 c string pointers

这是代码 -

 int main() {
     char c = 'A';
     char *p = &c;

     char *str = "Hello";

     printf("%s %s", p, str);
     return 0;
 }
Run Code Online (Sandbox Code Playgroud)

输出如下

A????? Hello
A?*??? Hello
A?z??? Hello
A???? Hello
A????? Hello
A??y?? Hello
A?*?? Hello
A?Z??? Hello
A?*+?? Hello
A?l?? Hello
A?z?? Hello
A??i?? Hello
A???? Hello
Run Code Online (Sandbox Code Playgroud)

现在我知道%s试图寻找'\ 0'来停止打印,这就是char指针str完美输出的原因.

但我想知道的是,当我们将char*指向单个字符时,它会在实际char之后打印一些垃圾值 - 它如何决定每次丢失4或5个垃圾值后停止?这项安全检查如何运作?据他所知,"?" 可能是字符串的一部分.

Ste*_*ner 6

对于格式"%s",相应的参数必须指向有效的C-String,这意味着它必须满足两个条件:(1)它必须是类型char*(或const char*),以及(2)它必须指向表示序列的对象'\0'在对象边界内终止的字符.

如果你这样做

char c;
char* ptr = &c;
Run Code Online (Sandbox Code Playgroud)

那么变量ptr只满足第一个条件; 它是a char *,但它指向的对象只包含一个字符,如果不是这个字符'\0',那么char"sequence"不会在对象的边界内终止.

因此,printf将访问对象外部的内存,从而产生未定义的行为.一种这样的行为可能是它只是继续读取内存(即使它不是拥有的)直到'\0'遇到某个地方.这就是你可能正在观察的东西.