内部产品功能,不使用C中的数组下标

时间:2016-05-05 18:57:52

标签: c

我尝试为内部产品编写功能,但程序无法正常工作。 你能告诉我我的错误在哪里吗?

#include<stdio.h>
#include<stdlib.h>

int inner_product(const int *a, const int *b, int size) 
{
  int sum = 0, i;

  for (i=0; i<size; ++i) 
  sum += *(a+i) * *(b+i);

   return sum; 
}


int main()
{
    int n, a, b;
    printf("How many elements do you want to store?  ");
    scanf("%d",&n);

    printf("%d",inner_product(&a,&b,n));
    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:0)

刚开始:

主要:

int n, a, b; //   a & b are not initialized
.
scanf("%d",&n); // Think what is the use of n here.
.
printf("%d",inner_product(&a,&b,n)); 
/*  You passed address of a and b, this is OK but the value they
 *  store is indeterminate as per the standard
 */

在函数中

 for (i=0; i<size; ++i) 
 sum += *(a+i) * *(b+i); // Accessing the memory out of bound for size>1 behavior is undefined
// Remember you have only two pointers which you can legally dereference ie a and b

答案 1 :(得分:0)

首先,应该初始化指针a,b以使该段代码正常工作。 您将它们作为“int”值引入。因此,这些“数组”的项目数为1,因此您不需要任何循环来计算总和。

除此之外,不使用像

这样的复杂结构会好得多
*(a+i)

说:

更好(更易读)
a[i]

代替。

此外,您的代码中可能存在溢出问题 - 如果输入了两个值(在[i]和b [i]中),产生大于“int”类型的和可以包含(超过2 ^ 32)? 您正在计算两个整数的总和为第三个整数而不进行任何检查。在生产软件中,它可能会导致安全漏洞。