any012 发表于 2016-7-15 10:19:15

定义变量后是不是默认为0?

调试程序遇到问题。
程序走到adcValue = GetAdcDate();这一步不往下走了。
后来将mearChalNum通过串口输出出来,发现不为0,是个比较大的数,而adcValue只是个存放4个8位数的数组。

mearChalNum是通过函数的参数传递过来的。
void GetTemptValue(u8 mearChalNum)
{
    ...
    adcValue = GetAdcDate();
    ...
}

而主函数是这样的:
void main()
{
    ...
    u8 ad7193ChalNum;
    ...
    while(1)
   {
    ...
    GetTemptValue(ad7193ChalNum);
    printf("\r\n\r\nad7193ChalNum: %d", ad7193ChalNum);
    ...
    }
}

将主函数里u8 ad7193ChalNum;改成u8 ad7193ChalNum = 0;程序就可正常执行了。

----------------------------------------------------------------

印象中C语言的变量定义后默认是0吧?

moyanming2013 发表于 2016-7-15 10:19:16

外部全局的和静态变量,编译器基本都会(但也有时候不会)把变量初始化为0,其余内部变量都不进行初始化,值随机的。
建议:不论外部全局、静态还是内部的变量都要初始化!

any012 发表于 2016-7-15 10:30:46

本帖最后由 any012 于 2016-7-15 10:36 编辑

proceState: 1

ad7193ChalNum: 134242684

proceState: 2

ad7193ChalNum: 134242684/r/n waitMISOtoLow

未给ad7193ChalNum赋值时,串口输出的数。

---------------------------------------------------------

反复上电几次,串口输出的ad7193ChalNum的值都是134242684,转为16进制为800617C。
程序里有让ad7193ChalNum不断增1的地方,但一旦大于3就将其清零。其余的地方暂时还没想到有其他地方对其赋值。

moyanming2013 发表于 2016-7-17 20:11:18

any012 发表于 2016-7-15 10:30
proceState: 1

ad7193ChalNum: 134242684


ad7193ChalNum是u8类型的,值最大为255,你看到的不对。
另外串口输出的可能是uint32位的,你可以直接输出&ad7193ChalNum处1个字节的值,此处串口输出不准确。建议直接调试,不用串口输出。调试是直接解决问题的快速方式。
对于未定义的行为(即:对于未初始化的变量查看其值是什么)你还是不要在这种地方上浪费时间,它的值是随机的(尽管每次串口输出一样没准你重启后的系统就不同了)。

any012 发表于 2016-7-18 08:51:07

moyanming2013 发表于 2016-7-17 20:11
ad7193ChalNum是u8类型的,值最大为255,你看到的不对。
另外串口输出的可能是uint32位的,你可以直接输 ...

感谢回复。
页: [1]
查看完整版本: 定义变量后是不是默认为0?