在C中指针有问题

时间:2011-04-03 22:04:17

标签: c arrays pointers

所以我有这段代码:

#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

为什么输出奇怪的数字有时候和正确的答案? 我究竟做错了什么? 谢谢你的帮助。

5 个答案:

答案 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++)相同; *在此实例中不执行任何操作
  • arrayEnd设置为*a + 3,或1 + 34
  • 你的for循环在数组耗尽之前没有终止。访问数组限制之外会调用未定义的行为
  • 你的程序也可以输出“强大的金额不是你所期望的!\ n”

答案 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
  • 经过3次迭代后,a指向的values[2]3。稍后,当a递增时, 它指向value[2]以外的地址 - 此地址可以包含任何垃圾值。 如果垃圾值小于4,则会计算sum。此行为一直持续到 遇到大于4的值。 因此sum的值有时为6或其他一些垃圾值