为什么这个C++ char数组似乎能容纳超过它的大小?

neu*_*cer 4 c++ g++ char

#include <iostream>
using namespace std;

typedef struct
{
    char streetName[5];

} RECORD;

int main()
{
    RECORD r;
    cin >> r.streetName;
    cout << r.streetName << endl;

}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,如果我输入超过5个字符,输出将显示我输入的整个字符串.它不会截断5个字符.这是为什么?

我怎样才能让它正常工作?

twk*_*twk 13

你正在溢出缓冲区.在streetName之后放置另一个char数组,你可能会发现它获得了其余的字符.现在你只是破坏堆栈上的一些内存.


AnT*_*AnT 6

为了将输入限制为接收阵列的大小,您需要使用输入法提供的长度限制功能.在您正在使用的情况下cin,这意味着您可以使用其width方法指定限制

cin.width(5);    
cin >> r.streetName;
Run Code Online (Sandbox Code Playgroud)


Pau*_*l R 5

因为你已经超出了缓冲区的末尾,在这种特殊情况下,你正在逃避它.C和C++让你很容易"在脚下射击",但这并不意味着你应该这样做.


use*_*019 5

因为cin将streetName视为char*并写入内存,所以没有什么可以停止写入*(streetName + 6)以及更进一步.这是缓冲区溢出的一种形式

在这种情况下,最好的代码是将streetName定义为std :: string

typedef struct
{
        std::string streetName;
} RECORD;
Run Code Online (Sandbox Code Playgroud)