在C中使用和不使用看似不必要的指针声明

在C中使用和不使用看似不必要的指针声明,c,pointers,C,Pointers,我有一段代码,其中我使用指针计算整数数组的和: int exercise1c (void){ int arr[] = {12, 7, -3, 4, 1}; int *numb = arr; int i; int sum; while (i<5){ sum += *(arr + i); i++; } printf("%d", sum); return 0; } int exercise1c(无效){ int arr[]={12,7,-3,4,1};

我有一段代码,其中我使用指针计算整数数组的和:

int exercise1c (void){

int arr[] = {12, 7, -3, 4, 1};
int *numb = arr; 
int i;
int sum;

while (i<5){
  sum += *(arr + i);
  i++;
}

printf("%d", sum);

  return 0;
}
int exercise1c(无效){
int arr[]={12,7,-3,4,1};
int*numb=arr;
int i;
整数和;
而(i您使用未初始化的非静态局部变量
int sum;
的值调用了未定义的行为,该值是不确定的

然后,删除行似乎在某种程度上影响了编译器的优化过程


初始化变量(例如,
int-sum=0;
)以避免问题。

初始化
sum
int-sum=0;
,注意溢出。顺便说一句:
sum+=*(arr+i);
也可以写成
sum+=arr[i];
…在我看来,只能写成
arr[i]
…一般规则:如果删除不相关的代码会改变程序的行为,这强烈表明程序调用了未定义的行为。在使用局部变量之前,需要初始化它们。打开编译器警告(使用选项
-Wall-Wextra-Werror
和gcc或clang)编译器会提醒你这一点。在你的代码中,你需要初始化
sum
i