电话
400 9058 355
News
数组名不是指针,更非“常指针”;其类型为int[5],sizeof(arr)返回整个数组字节数,&arr类型为int(*)[5],与指针类型有本质区别。
C++数组越界访问不崩溃但行为不可预测:operator[]和原生下标无边界检查,越界读得垃圾值,越界写覆写栈数据,导致逻辑错乱、延迟崩溃或看似正常;std::vector::at()抛异常而operator[]不检查;栈溢出可劫持控制流;看似安全的长度判断可能因整数溢出等失效。
vector::at()会抛出std::out_of_range异常,operator[]不检查越界且行为未定义;at()是标准强制边界检查,operator[]始终零开销、无编译选项可启用检查。
只有原生栈数组可用sizeof(arr)/sizeof(arr[0])求长度;传参后退化为指针、动态数组、STL容器均不适用,应改用std::array::size()等安全接口。
手写C++数组栈的核心是用int型top变量表示下一个空位索引(初值为0),入栈前检查top0,栈顶元素为data[top-1];需禁用拷贝、初始化数组、统一使用int型top避免符号问题。
vector::at()在越界时抛std::out_of_range异常,operator[]不检查越界、行为未定义;前者有运行时开销,后者零成本但危险;调试模式下可启用operator[]边界检查。
一维数组转二维数组本质是内存布局的重新解释;C++中无真正维度改变,仅通过不同指针类型访问同一连续内存,强制转换需确保长度整除列数,否则易越界。
首选std::unordered_set辅助去重以获得无重复副本,时间复杂度低且代码简洁;原地去重则用双指针法,O(n)时间、O(1)空间,需手动resize。
邮箱:8955556@qq.com
Q Q:8955556