我制作了一些程序来查看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");
}
}
答案 0 :(得分:3)
您fors
不正确。
索引从0
开始,而不是从1
,c数组和矩阵开始。
使用<=
您正在寻找属于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; (或分段错误)是副作用之一。