C++ 为什么不是';斯特伦为我工作吗? charp[4]={'h','g','y'}; cout

C++ 为什么不是';斯特伦为我工作吗? charp[4]={'h','g','y'}; cout,c++,string,C++,String,从给定的指针开始,直到到达字符“\0”。如果数组中没有'\0',则它可以是任何数字,直到到达'\0' 另一种方法是使用:int length=sizeof(p)/sizeof(*p),它将为您提供数组的长度。但是,严格来说,这不是由strlen定义的字符串长度 正如@John Dibling提到的,strlen在您的第一个示例中给出正确结果的原因是您为4个字符分配了空间,但只使用了3个;剩余的1个字符自动初始化为0,这正是strlen查找的'\0'字符。'\0'终止字符缓冲区 char p[]=

从给定的指针开始,直到到达字符
“\0”
。如果数组中没有
'\0'
,则它可以是任何数字,直到到达
'\0'

另一种方法是使用:
int length=sizeof(p)/sizeof(*p),它将为您提供数组的长度。但是,严格来说,这不是由
strlen
定义的字符串长度


正如@John Dibling提到的,
strlen
在您的第一个示例中给出正确结果的原因是您为4个字符分配了空间,但只使用了3个;剩余的1个字符自动初始化为0,这正是strlen查找的
'\0'
字符。

'\0'
终止字符缓冲区

char p[]={'h','g','y'};
cout<<strlen(p);

这将得到一个随机数
strlen
要求字符串以
'\0
'结尾才能工作。

请尝试以下操作:

char p[4]={'h','g','y', '\0'};

只有第一个示例具有以null结尾的字符数组-其他两个示例没有以null结尾的字符,因此您不能以定义良好的方式对它们使用
strlen()

char p[4]={'h','g','y', '\0'};
请注意,在最后一种情况下,如果使用字符串文字来初始化数组,将得到一个空终止符:

char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'

char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator

char p[]={'h','g','y'};  // p[] implicitly sized to 3 - also no room for '\0'

这是因为strlen()希望为字符串找到空终止符。在本例中,您没有它,因此strlen()会一直计数,直到它发现\0或出现内存访问冲突并导致程序死亡。扯开

strlen
是一个标准的库函数,可以处理字符串(在术语的C意义上)。字符串定义为以
\0
值结尾的
char
值数组。如果您向strlen提供的不是字符串的内容,则行为未定义:代码可能崩溃,代码可能产生无意义的结果等


在您的示例中,只有第一个提供了字符串
strlen
,这就是它按预期工作的原因。在第二种和第三种情况下,您提供的不是字符串(不是以
\0
结尾),这就是预期结果没有意义的原因。

另外,使用
char p[]=“hgy”@Paul:因为大约有17个人同时格式化了它。同步编辑警告只在编辑时间超过一分钟左右时生效。这有一个<代码> C++ >代码>标签,为什么你在C++中使用C字符串?正如您刚刚发现的,它们对于初学者来说有点难用。使用
std::string
。它不会完全隐藏这种疯狂,但它会将其降低到一个新手可以处理的水平。@Johannes,你是说没有足够的初始值设定项吗?因为在所有情况下,我都看到提供的初始值设定项有足够的空间。祝贺你用C字符串编写了缓冲区溢出!你加入了一个深受全世界黑客喜爱的精英编码团队。+1这是一个很好的回应。我要补充的唯一一件事是解释为什么第一个代码段可以工作。在
charp[4]={'h','g','y'}
p是4个字符,但只有3个被显式初始化,因此编译器将所有剩余(未指定)元素初始化为
0
。我完全同意上面的评论。在这个特定示例中,最后的
\0
是不必要的。所有未指定的元素将被初始化为零。严格来说,数字将是未定义的,而不是随机的。(即,不要使用strlen()作为彩票结果的基础;^))
char p[4]={'h','g','y', '\0'};
char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'

char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator

char p[]={'h','g','y'};  // p[] implicitly sized to 3 - also no room for '\0'
char p[]= "hgy";  // p[] has 4 elements, last one is '\0'