c++ - 溢出的 char 数组每次都会覆盖完全相同的字符串 - 为什么?

标签 c++ arrays string char

我有以下代码显示了在字符串上使用 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 ”)。

  1. 为什么会这样? (普遍的好奇心)
  2. 为什么数组的大小是 16 个字符而不是 10 个?
  3. 为什么总是 password 被覆盖,而不是我不会立即注意到的其他变量或内存的其他部分?
  4. 那么在字符串上使用 char[] 有什么好处?

编辑:更新了后续问题:
5. 为了响应passwordmsg 彼此相邻声明的论点,我将声明 block 打乱如下:

char password[] = "SECRET";
char ch;
int i = 0;
char msg[10];

但是,没有变化。
6. 作为对导致 msgpassword 之间的差距为 6(字节?)长的说法的回应,我已经多次重新编译代码,包括上面的改组。仍然没有变化。

关于原因有什么建议吗?

最佳答案

前三个问题的答案是相同的:因为这就是您的编译器选择在堆栈上布置这些变量的方式。标准中没有任何内容可以保证 - 事实上,您正在做的是未定义的行为 - 任何事情都可能发生。

更改编译器,甚至更改编译器设置,可能会发生其他事情。或不。没有告诉。

至于4,除了与C代码的互操作,或者其他需要C风格字符串的API,基本没有。

关于c++ - 溢出的 char 数组每次都会覆盖完全相同的字符串 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23756647/

相关文章:

php - 使用 PHP 在 Mysql 中数组到字符串错误

string - Scala:如何获得字符串的转义表示?

C#如何Regex.Replace "\r\n"(实际字符,不是换行符)

c++ - 如何使用 TCP 窗口缩放来增加 C++ 中 AWS S3 的吞吐量?

c++ - INET应用层如何发送广播包

c++ - 带有 Boost 的 Node-gyp 包含和库目录

c# - 如何在 C# 中有效地将公共(public)初始值分配给大型数组?

java - int[] 和 Integer[] 数组 - 有什么区别?

c++ - 字符串下标超出范围 - 我在哪里犯了错误?

c++ - 更改 CListCtrl 中特定项目的颜色?