所以我有这段代码:
#include <stdio.h>
int arraySum (int *a, int n);
int main(void){
int values[3] = {1, 2, 3};
printf("The sum is %i\n", arraySum(values, 3));
return 0;
}
int arraySum(int *a, int n){
int sum = 0;
int arrayEnd = *a + n;
for ( ; *a < arrayEnd; *a++)
sum += *a;
return sum;
}
由于某种原因,它输出:
roman@lmde64 ~/Dropbox/Practice $ gcc practice.c
roman@lmde64 ~/Dropbox/Practice $ ./a.out
The sum is -421028781
roman@lmde64 ~/Dropbox/Practice $ ./a.out
The sum is -362865581
roman@lmde64 ~/Dropbox/Practice $ ./a.out
The sum is -1046881197
roman@lmde64 ~/Dropbox/Practice $ ./a.out
The sum is 6
roman@lmde64 ~/Dropbox/Practice $ ./a.out
The sum is 6
为什么输出奇怪的数字有时候和正确的答案? 我究竟做错了什么? 谢谢你的帮助。
答案 0 :(得分:14)
在arraySum()
中,您在使用a
作为指针时会感到困惑,何时取消引用它以获取它所指向的内容。在计算循环限制等时,您希望使用指针本身:
int arraySum(int *a, int n){
int sum = 0;
int *arrayEnd = a + n;
for ( ; a < arrayEnd; a++)
sum += *a;
return sum;
}
答案 1 :(得分:2)
你想迭代数组:
int arraySum(int *a, int n){
int sum = 0;
int * arrayEnd = a + n; // arrayEnd points to the first element after your array a
for ( ; a != arrayEnd; ++a) // Iterate over the array until you reach arrayEnd
sum += *a; // Dereference the pointer to current array element in order to retrieve a value
return sum;
}
答案 2 :(得分:1)
*a++
与*(a++)
相同; *
在此实例中不执行任何操作*a + 3
,或1 + 3
或4
答案 3 :(得分:1)
int arraySum(int *a, int n) {
int sum = 0;
for (int i = 0; i < n; ++i)
sum += a[i];
return sum;
}
或
int arraySum(int *a, int n) {
int sum = 0;
for (int i = 0; i < n; ++i)
sum += *a++;
return sum;
}
答案 4 :(得分:1)
在原始代码中,
*a + n
评估为1+3 = 4
for
循环的每次迭代中,*a
指向的值都与4
进行比较。*a
小于4
,则会计算sum
。a
指向的values[2]
为3
。稍后,当a
递增时,
它指向value[2]
以外的地址 - 此地址可以包含任何垃圾值。
如果垃圾值小于4
,则会计算sum
。此行为一直持续到
遇到大于4
的值。
因此sum
的值有时为6
或其他一些垃圾值