【发布时间】:2017-11-27 12:48:36
【问题描述】:
如果将SIZE 从 7 更改为 8,则下面的代码会显示不一致。如果 SIZE 为 7,则 strlen(chars) 返回 7;如果SIZE 为8,则strlen(chars) 返回9,不再等于SIZE。
我知道 strlen 适用于 C 字符串,而下面的 chars 不是 C 字符串(因为它没有空终止字符 \0)。但我目前正在调试其他人的代码并试图理解为什么会出现所描述的不一致,即使 strlen 似乎没有以正确的方式使用。有什么想法吗?
#include <iostream>
#include <string>
#define SIZE 7
int main ()
{
char chars[SIZE];
for (int i=0; i<SIZE; i++) chars[i]='A'+i;
std::cout<<"strlen(chars) = "<<strlen(chars)<<std::endl;;
std::cout<<"SIZE = "<<SIZE<<std::endl;;
return 0;
}
【问题讨论】:
-
您正在调用未定义的行为。任何事情都有可能发生。实际上,您受
chars变量周围堆栈内容的支配。 -
这也是告诉那些“其他人”他们应该使用
std::string的完美例子,这样所有这些问题都可以避免。 -
@zell 那你有什么问题?想听到有人说“未定义的行为是未定义的。”?
-
@zell UB 中没有顺序,因为未定义的行为是未定义的。
-
好吧,语言规范没有定义它。完全有可能某些特定的编译器/操作系统/架构组合确实将此行为指定为扩展,但 OP 仍然没有告诉我们什么任何 这三件事是(无论如何,在没有充分理由的情况下依赖这样的扩展可能是不明智的)。