【发布时间】:2014-05-20 10:00:14
【问题描述】:
我有以下代码显示了在字符串上使用 char 数组的危险:
int main(){
char password[] = "SECRET";
char msg[10], ch;
int i = 0;
cout << "Please enter your name:";
while((ch = getchar()) != '\n'){
msg[i++] = ch;
}
msg[i] = '\0';
cout << "\n\nHello " << msg << endl;
cout << "The password is " << password;
}
当我输入一个超过 16 个字符的名称(存储在 char msg[10])时,这 16 个字符之后的所有内容都会替换存储在 char password[](“秘密”)中的值。 p>
- 为什么会这样? (一般的好奇心)
- 为什么是 16 个字符而不是 10 个 - 数组的大小?
- 为什么总是
password被覆盖,而不是其他变量或我不会立即注意到的内存的其他部分? - 那么在字符串上使用 char[] 有什么好处呢?
编辑:更新了后续问题:
5. 针对 password 和 msg 声明彼此相邻的论点,我将声明块改组如下:
char password[] = "SECRET";
char ch;
int i = 0;
char msg[10];
但是,没有任何变化。
6. 针对这样的论点:msg 和 password 之间的差距是 6(字节?)长,我已经多次重新编译代码,包括上面的改组。仍然,没有变化。
关于原因有什么建议吗?
【问题讨论】:
-
@DrakaSAN:删除标签,谢谢。
-
“使用
char[]比使用std::string有什么好处?”? - 什么都没有。 -
“因为未定义的行为”。但这并不是很令人满意。 “因为变量在内存中彼此相邻,两者都是彼此相邻声明的
char数组,这并不奇怪。