运行时检查:变量堆栈已损坏

时间:2018-02-09 03:59:17

标签: c++

我正在创建一个程序,用文件中的值重写数组。我已将以下代码链接起来。运行该文件时,我收到错误"运行时检查失败,堆栈' arr'变量已损坏。

此外,程序的输出返回所有具有相同编号的阵列位置

arr[0] = -858993460

文件中用数字分隔的数字是:
    12
    13
    15

#include<iostream>;
#include<fstream>;
using namespace std;
template <class T>
void init(T * a, int size, T v)//done
{
    for (int i = 0; i < size; i++)
    {
        a[size] = v;
    }
}

bool getNumbers(char * file, int * a, int & size)//not done
{
    int count = 0;
    ifstream f(file);

    while (f.good() == true && count < 1)
    {
        f >> a[count];
        count++;
    }

    if (size > count)
    {
        return true;
    }
    else if (size < count)
    {
        return false;
    }
}

void testGetNumbers()
{
    int arr[5];
    int size = 5;

    cout << "Testing init and getNumbers." << endl;

    init(arr, 5, -1);

    cout << "Before getNumbers: " << endl;
    for (int i = 0; i < size; i++)
    {
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }

    if (getNumbers("nums.txt", arr, size))
    {
        cout << size << " numbers read from file" << endl;
    }
    else
    {
        cout << "Array not large enough" << endl;
    }

    cout << "After getNumbers: " << endl;
    for (int i = 0; i < size; i++)
    {
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }

    cout << endl;
}

int main()
{
    testGetNumbers();
    return 0;
}

3 个答案:

答案 0 :(得分:1)

第一个循环中的这一行看起来有错误。

a[size] = v;

它导致数组绑定访问和内存/堆栈损坏。它应该是

a[i] = v;

答案 1 :(得分:0)

'9'函数开始,行

main

...不是必需的,因为这是return 0; 的默认返回值。我会删除它,有些人坚持拥有它,我想大多数人都不在乎。但是,通过隐式或显式地完全了解代码表达的内容总是一个好主意,因此:返回0表示程序成功

对于明确的main返回值,我建议您使用main标题中的EXIT_SUCCESSEXIT_FAILURE名称。

然后更清楚。

<stdlib.h>调用main,除输出语句外,它的开头如下:

testGetNumbers

碰巧int arr[5]; int size = 5; init(arr, 5, -1); 函数有未定义行为没有按预期填充数组init,但忽略不计。现在,只看上面的冗长。考虑写一下这个:

-1

使用vector<int> arr( 5, -1 ); 标题中的std::vector

将调用链下移到<vector>后,找到

init

尝试将值a[size] = v; 分配给超出数组末尾的项目。

未定义的行为

应该是

v

但是如上所述,除非您的老师严格禁止,否则当您使用a[i] = v; 时,整个功能都是多余的。

std::vector备份,然后调用testGetNumbers,在我们找到的该功能中

getNumbers

通常情况下,不应在循环条件中使用ifstream f(file); while (f.good() == true && count < 1) { f >> a[count]; count++; } f.good():使用f.eof()。此外,〜永远不要将布尔值与f.fail()true进行比较,只需直接使用即可。然后循环可能如下所示:

false

提示:在标准C ++中,您可以将ifstream f(file); while (!f.fail() && count < 1) { f >> a[count]; count++; } 写为!,将not写为&&。使用Visual C ++编译器,您必须包含and标头才能执行此操作。

免责声明:此处提及的修补程序并不保证循环正确用于您的预期目的。实际上,当输入操作失败时,<iso646.h>的增量看起来可能是无意的。同样适用于循环限制。

该功能继续(或更确切地说,结束)

count

这有一个很大的问题:如果if (size > count) { return true; } else if (size < count) { return false; } 怎么办?然后执行继续从函数的末尾开始,而不返回值。这又是未定义的行为

我留给你来决定你希望函数在这种情况下返回什么,并确保它能做到。

答案 2 :(得分:0)

DELETE FROM course WHERE course.course_id NOT IN( SELECT section.course_id FROM section ); 函数中......

init

都能跟得上:

template <class T>
void init(T * a, int size, T v)//done
{
    for (int i = 0; i < size; i++)
    {
        a[size] = v;
    }
}

烨:

a[size] = v;