Question

I wrote a multiplication table like this:

#include <iostream>
#include <conio.h>
using namespace std;
int main(){
    int table[9][9], i, j;
    for (i = 0; i < 10; ++i){
        for (j = 0; j < 10; ++j)
        {
            table[i][j] = (i + 1) * (j + 1);
            cout << table[i][j] << "\t";
        }
        cout << endl;
    }
    _getch();
    return 0;
}

And when I run it it gives me the right answer but when I press a key it throws this error:

 run time check faliure #2-stack around the variable table was corrupted

But it doesn't throw that error when I change the code to this:

......
int main(){
    **int table[10][10]**, i, j;
    for (i = 0; i < 10; ++i){
......

If they both give the same answer then what's the difference??

Was it helpful?

Solution

You are overflowing your arrays, The max index in bounds is 8 (since the indices are zero based and you defined 9 cells as your dimensions size so 8 will be the last cell in each dimension) and your for loop can reach till 9 (including 9) which will cause an overflow.

OTHER TIPS

The snippet int table[9] declares an array of size 9, that means valid indices are actually 0-8. But your loop iterates from 0 to 9. This causes a write into an invalid memory region (which doesn't belong to your array), therefore corrupting your stack.

Now you actually have a two dimensional array, but the problem remains the same.

You're going outside the array in your for loops. They should be:

for (i = 0; i < 9; ++i){
    for (j = 0; j < 9; ++j)

The array indexes run from 0 to 8, but you were going up to 9 because your conditions were i < 10 and j < 10.

Arrays in C/C++ start with 0 index. When you declare table[9][9] you reserve memory for 9x9 array with indexes 0..8, 0..8 but in for loop your upper index is 9 - it is out of array range

I guess you should declare table like you pointed:

int table[10][10];

You are accessing out of array's range element. Your array is a 9x9 table but you are trying to access 10x10 table. So either use i<9 and j<9 in your both loops or increase your array size to table[10][10]. Hope this might help.

Rule of thumb: in for loops, N in (i = 0; i < N; i++) clause should (almost always) be equal to the corresponding array's length. When you see either i <= N or i < N + 1, it's (most often) a sign of the dreaded off-by-one bug.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top