Col*_*son 2 c arrays pointers initialization
我一直在HackerRank 处理这个简单的编码挑战.我决定将我的解决方案作为C函数实现,因为用另一种语言或主函数本身来做它似乎是微不足道的.我以为我会用这种方式搞砸数组/指针语法几次,我有机会学到一些东西.
这是我的功能:
int sum_diagonal(int n, int (*arr)[n]) {
int lD, rD, sum;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if (i == j) {
rD += arr[i][j];
}
if ((i+j) == (n-1)) {
lD += arr[i][j];
}
}
}
sum = abs(lD - rD);
return sum;
}
Run Code Online (Sandbox Code Playgroud)
这是main()
调用它的函数(提供输入矩阵的代码):
int main(){
int n;
scanf("%d",&n);
int a[n][n];
for(int a_i = 0; a_i < n; a_i++){
for(int a_j = 0; a_j < n; a_j++){
scanf("%d", &a[a_i][a_j]);
}
}
//printf("why does this make it work?");
int sum = sum_diagonal(n,a);
printf("%d", sum);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有时它完全按照预期工作,有时我得到垃圾输出.但是,更奇怪的是,如果我printf()
在主函数中取消注释该随机调用,它似乎每次都有效.到底是怎么回事?
在您的代码中,您已定义
int lD, rD, sum;
Run Code Online (Sandbox Code Playgroud)
没有初始化然后,你写道
rD += arr[i][j];
Run Code Online (Sandbox Code Playgroud)
和
lD += arr[i][j];
Run Code Online (Sandbox Code Playgroud)
rD
并且lD
是自动局部变量并且未初始化.在第一次迭代中,您使用它们来读取它们的值(即LHS +=
).
在那个时间点,他们的内容(价值)是不确定的.正如您所做的那样,使用它们会调用未定义的行为.
解决方案:始终初始化本地变量,例如
int lD = 0, rD = 0, sum= 0;
Run Code Online (Sandbox Code Playgroud)