C++ 无法理解C中字符串和循环的这种意外行为

C++ 无法理解C中字符串和循环的这种意外行为,c++,c,string,for-loop,char,C++,C,String,For Loop,Char,这是我的C程序及其输出的屏幕截图,这是我在一本书中遇到的一个问题 正如您所看到的,在我的代码中有一个for循环。所以我做的是,我改变了循环初始化的值 for(i=6;s1[i]!='\0';i++); 现在输出又恢复了 母体 6号 我一次又一次地更改初始化值,然后取i的输出值,如下所示 初始化| | | | i的输出值 6->6 7->11 8->11 9->11 10->11 11->11 12->20 我的问题 为什么它不能给我i的值=循环的初始化值, 每当我把循环的初始化值>输入的str

这是我的C程序及其输出的屏幕截图,这是我在一本书中遇到的一个问题

正如您所看到的,在我的代码中有一个for循环。所以我做的是,我改变了循环初始化的值

for(i=6;s1[i]!='\0';i++);
现在输出又恢复了

母体 6号

我一次又一次地更改初始化值,然后取i的输出值,如下所示

初始化| | | | i的输出值

6->6

7->11

8->11

9->11

10->11

11->11

12->20

我的问题

为什么它不能给我i的值=循环的初始化值, 每当我把循环的初始化值>输入的stringi.e的大小放入这个矩阵时


因为6之后的所有字符数组元素都应该为null,不是吗


因为6之后的所有字符数组元素都应该为null,不是吗

不,它们不必是\0。他们可以持有任何价值。您只需循环,直到找到下一个碰巧在那里的0。当您实例化内置类型的自动存储阵列时,如下所示:

char s[20];
char s[20] = {};
没有对元素执行初始化。它们具有不确定的值。从他们身上读东西甚至是未定义的行为。您可以强制零初始化元素,如下所示:

char s[20];
char s[20] = {};

哈哈,你们找不到更现代的编译器了?为什么要偷懒,把你们的代码打印出来?在这里输入@阿披舍克本萨尔:不工作。给出大小0Size 1Size2…因为6之后的所有字符数组元素都应该为null,不是吗?:不,这是一个错误的假设。这些元素是未初始化的,并且具有不确定的值。如果你确实在C中编码,使用.c文件扩展名,从你的帖子中删除C++标签。那么为什么每次运行程序时,它的第十一或第二十值都是空的,因为它应该是随机的?它可能会也可能不会一直以相同的方式工作。@DemoSocket这是未定义的行为。理论上,它永远不会找到一个零,并给你一个分割冲突,或是完全随机的。在实践中,总会有一个对齐字节大小的零块,这很可能取决于起始条件。因此,您可能会得到看似可重复的结果。但是你不能依赖它。。。顺便说一句这给了我一个预期的错误Expression@DemonSocket我的答案是C++,因为你把你的问题标记为这样。在C语言中,您可能需要字符s[20]={0};。