我有以下代码显示了在字符串上使用 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[]
(“ secret ”)。
- 为什么会这样? (普遍的好奇心)
- 为什么数组的大小是 16 个字符而不是 10 个?
- 为什么总是
password
被覆盖,而不是我不会立即注意到的其他变量或内存的其他部分? - 那么在字符串上使用 char[] 有什么好处?
编辑:更新了后续问题:
5. 为了响应password
和msg
彼此相邻声明的论点,我将声明 block 打乱如下:
char password[] = "SECRET";
char ch;
int i = 0;
char msg[10];
但是,没有变化。
6. 作为对导致 msg
和 password
之间的差距为 6(字节?)长的说法的回应,我已经多次重新编译代码,包括上面的改组。仍然没有变化。
关于原因有什么建议吗?
最佳答案
前三个问题的答案是相同的:因为这就是您的编译器选择在堆栈上布置这些变量的方式。标准中没有任何内容可以保证 - 事实上,您正在做的是未定义的行为 - 任何事情都可能发生。
更改编译器,甚至更改编译器设置,可能会发生其他事情。或不。没有告诉。
至于4,除了与C代码的互操作,或者其他需要C风格字符串的API,基本没有。
关于c++ - 溢出的 char 数组每次都会覆盖完全相同的字符串 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23756647/