首页 > 解决方案 > 我的数组程序中这个堆栈粉碎错误的原因是什么?

问题描述

我有一个插入值并移动元素的数组。尽管它可以编译,但我有一些警告。这是我的代码:

#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 循环时,它们似乎在界限内,看起来我并没有试图访问不存在的东西......是什么导致了这个错误?

标签: c++arraysinsert

解决方案


您的代码执行此操作

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];
}

推荐阅读