在对数组元素求和时,竟然离奇的发现错了,冲了一会儿浪之后才现在问题在这里
main函数代码:
int main(void){
int arr[5] = {1,2,3,4,5};
int res = sum(arr,arr+5);
printf("%d",res);
}
求和函数(利用双指针求的数组元素之和)为:
int sum(int *start,int *end)
{
int total;
while(start < end){
total += *start;
}
return total;
}
惊奇的发现结果是:32
于是将int total;
改为int total = 0;
之后显示15正确。
最后进行总结:没有弄清楚C语言中原始变量的初始值造成的
结论:在C语言中,局部变量时如果未初始化(int total;
),则值是随机的
int main (void){
int num;
int num2 = 5;
}
num2的值初始化为5,但是num变量的值是之前占用分配num的空间中的任意值,别指望这个值会是0.
定义局部变量,其实就是在栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(脏的,上次用完没清零的),所以说使用栈来实现的局部变量定义时如果不显式初始化,值就是脏的,即随机的。
c语言中只有局部变量在未赋初值时,才是随机数。
全局变量和静态变量未赋初值时编译器会自动将其初始化为0。
局部变量是分配在堆栈上的,而全局变量和静态变量是分配在数据段中的。这个跟程序的内存分配是有关系的。
C语言中内存分配与释放里面对于C语言中的内存分配讲的很清楚,可以参考。