循环数组会导致程序崩溃

时间:2016-02-01 15:34:28

标签: c arrays loops

我制作了一些程序来查看7 * 7的表格.... 它的工作,但由于某种原因程序在程序结束时崩溃。 我的编译器是GCC,我使用C99。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <string.h>
#define LENGTH 7

void printsTable(int arr[LENGTH][],int len);

int main()
{
    int table[LENGTH][LENGTH] = {0};
    int i = 0, j = 0;
    for(j = 1; j <= LENGTH; j++)
    {
        for(i = 1; i <= LENGTH; i++)
        {
            table[j][i] = pow(j,i);
        }
    }
    printsTable(table,LENGTH);
    return 0;
}

void printsTable(int arr[][LENGTH],int len)
{
    int i = 0, j = 0;
    for(i = 1; i <= LENGTH; i++)
    {
        for(j = 1; j <= LENGTH; j++)
        {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
}

2 个答案:

答案 0 :(得分:3)

fors不正确。 索引从0开始,而不是从1数组和矩阵开始。

使用<=您正在寻找属于UB的界限,因为i的最后一个循环将指向table[j][7],并且最后一个循环为{ {1}}将指向j。所有这些地址都在表分配空间之外,从table[7][i]table[0][0]

您应该更正您的代码,如下所示

table [6][6]

或者,但不推荐,

for(j = 0; j < LENGTH; j++)
{
    for(i = 0; i < LENGTH; i++)
    {
        table[j][i] = pow(j,i);
    }
}

for(j = 1; j <= LENGTH; j++) { for(i = 1; i <= LENGTH; i++) { table[j-1][i-1] = pow(j,i); } } 函数循环也一样。

答案 1 :(得分:1)

C对数组使用基于0的索引。

因此,对于定义为if (login(newhash(password)) == 0) // login using new hash function doesn't work { if (login(oldhash(password)) == 1) // login with old hash works { SqlConnection.ChangePassword(connstr); login(newhash(password)); } } 的数组,有效访问索引是从int table[LENGTH][LENGTH]table[0][0]

您需要更改

table[LENGTH -1][LENGTH -1]

for(j = 1; j <= LENGTH; j++)

留在数组范围内。否则,您将off-by-one。走出界限会调用undefined behavior。 A&#34;崩溃&#34; (或分段错误)是副作用之一。