c++ - 我的数组程序中这个堆栈粉碎错误的原因是什么?
问题描述
我有一个插入值并移动元素的数组。尽管它可以编译,但我有一些警告。这是我的代码:
#include <iostream>
void display_array(int arr[], int max_length = 10);
void insert_array(int arr[], int insert_num, int index_num, int max_length = 10);
int main() {
int arr_length = 10;
int new_score, index;
int test_scores[arr_length] = {86, 71, 92, 84, 88, 96};
display_array(test_scores);
std::cout << "Enter new test score: ";
std::cin >> new_score;
std::cout << "\nEnter index position: ";
std::cin >> index;
insert_array(test_scores, new_score, index);
display_array(test_scores);
return 0;
}
void display_array(int arr[], int max_length) {
std::cout << "Test scores in array: ";
for(int i = 0; i < max_length; i++) {
std::cout << arr[i] << " ";
}
std::cout << "\n";
}
void insert_array(int arr[], int insert_num, int index_num, int max_length) {
for(int i = max_length; i > index_num; i--) {
arr[i] = arr[i - 1];
}
arr[index_num] = insert_num;
}
在 VS Code 中,我收到警告:“变量“test_scores”可能未初始化 C/C++ (145)”
我将“arr_length”变量更改为常量并且它消失了,但是尽管我的代码在更改后仍然可以编译并执行其所有功能,但在我的程序结束时我得到了
*** stack smashing detected ***: terminated
Aborted (core dumped)
gdb 给了我这样的东西:
Program received signal SIGABRT, Aborted.
0x00007ffff7acd615 in raise () from /usr/lib/libc.so.6
我检查了这个链接进程何时获得 SIGABRT(信号 6)?这似乎是一个内存问题。但是当我查看我如何构建我的数组和我的 for 循环时,它们似乎在界限内,看起来我并没有试图访问不存在的东西......是什么导致了这个错误?
解决方案
您的代码执行此操作
for(int i = max_length; i > index_num; i--) {
arr[i] = arr[i - 1];
}
其中max_length
等于 10。但您的数组大小为 10,因此最大有效索引为 9。更改为
for(int i = max_length - 1; i > index_num; i--) {
arr[i] = arr[i - 1];
}
推荐阅读
- matlab - Matlab中如何区分vpa和sym
- php - Wordpress Contact Form 7 自定义验证规则未执行
- visual-studio-code - `viewsContainers`中`activitybar`的条件贡献
- php - Laravel:vue文件中body和html标签的本地css
- angular - “x”是只读的,但不是
- tensorflow - Tensorflow Lite 基准测试应用说明
- swift - 冲突调用 viewDidLoad() 和另一个代码块
- flutter - 将按钮颜色更改为弯曲导航栏中选项卡上的主要颜色
- arrays - 如何组合字典中的重复键并快速总结值?
- android - 用于测试 SafetyNet 验证应用 API 的潜在有害应用程序示例