1

我应该知道这一点,但我不知道,我认为这可能是我基础知识的一个重大差距,所以我想我应该问专家。

鉴于:

 char s1[] = { 'M', 'y', 'W', 'o', 'r', 'd' };
 char s2[] = "MyWord";

cout << strlen(s1)<<endl;
cout << strlen(s2)<<endl;

cout << sizeof(s1)<<endl;
cout << sizeof(s2)<<endl;

为什么声明为s19strlen而声明为s26?额外的 3 来自哪里,它缺少空终止字符?

而且我知道这sizeof(s2)比 s2 大 1 字节,sizeof(s2)因为 s2 会自动添加空字符?

请温柔一点,TIA!

4

6 回答 6

7

char s2[] = "MyWord";由于 "" 声明,自动添加空终止符。

s1声明没有。当您执行strlenons1时,结果为 9,这是因为它最终遇到了 \0 并停止了。s1不应与 strlen 一起使用,因为它不是空终止的。s1 上的 strlen 可能是 1,000。如果开启内存违规检测,s1 的 strlen 会崩溃。

于 2012-05-20T14:46:55.230 回答
7

第一个缺少\0第二个中存在的隐式终止符。因此:

  • 第一个1小于第二个,内存方面
  • strlen第一个是未定义的行为(因为它缺少终止符)
于 2012-05-20T14:46:55.553 回答
2

如您所说,缺少终止空字符。

strlen函数被调用时s1,它会计算字符直到找到一个终止符'\0'。根据内存的初始化方式,您可能会得到不同的结果。

您的定义s2实际上相当于

char s2[] = { 'M', 'y', 'W', 'o', 'r', 'd', '\0' };
于 2012-05-20T14:47:03.883 回答
2

s1 只是偶然的 9;您只能在终止的字符串上使用 strlen 。将其声明为 char s1[] = { 'M', 'y', 'W', 'o', 'r', 'd', '\0' }; 看看会发生什么。

于 2012-05-20T14:47:37.970 回答
1

strlen(s1) 可以返回任何大于 6 的值。因为他正在搜索第一个 '\0' 字符而您没有提供它。

于 2012-05-20T14:48:40.143 回答
1

在您的代码中,

  • s1并且s2是 的数组char
  • s1最后一个元素是d,而s2最后一个元素是\0

也就是说, 中多了一个字符s2。它是一个以空字符结尾的字符串,但s1不是以空字符结尾的字符串。

由于s1不是以 null 结尾的字符串,因此表达式strlen(s1)将调用undefined behavior,因为strlen将继续读取s1最后一个元素。

于 2012-05-20T15:29:59.603 回答