在C中,如果我不使用局部变量,在它被赋值之前,不初始化它可以吗?

zkure5ic  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(163)

我知道使用一个未初始化的变量是错误的,但是问题出现在一个未初始化的整数的上下文中,我在后面的代码中给它赋值之前没有使用它。
我应该期待得到奇怪的结果吗?或者这只是糟糕的做法?
我是一名计算机专业的大一学生,如有任何错误,请见谅!

iszxjhcz

iszxjhcz1#

这是好的:

int i;
result = someFunc(&i);//it does not matter what value i is, it will 
                      //be assigned in the function.

字符串
其中someFunc()定义为:

void someFunc(int *in)
{
    *in = 10;
}


这不好

int i;
int someArray[10];
int a = someArray[i];//it is not known what value 'i' is. Fault if > 9.


但是作为一个良好的编程习惯 (可维护性,可读性,主动bug预防),只初始化总是一个好主意:

int i = 0;
char *tok = NULL;
char string[] = {"string"};
float array[100] = {0};
... and so on.

vdgimpew

vdgimpew2#

从程序的Angular 来看,不立即初始化变量是完全没有问题的。因此:

int a;

// 10000 lines of code

// line 10001
a = 0
use(a);

字符串
完全没问题
但是发生的事情是,人们(包括我自己)会在10001行之前开始使用这个变量,忘记他们没有初始化它,得到垃圾,然后认为代码有问题。你知道恐慌发作,* 为什么这东西不工作?* 你会这样做:

int a;

// line 2001 this happens
use (a);

// 10000 lines of code

// line 10001
a = 0
use(a);


哦,该死的,我的use(a)函数不工作,而不是花一两个小时调试完美工作的代码。一些编译器会给你给予警告,但有些不会。
这有点像汽车里的安全带,你不太可能发生事故,但你还是戴上了它,你不应该等到看到警察才戴上它,因为在你到达警察之前,你发生事故的机会很小。

t9aqgxwy

t9aqgxwy3#

如果变量在初始化之前从未被读取,并且变量在被读取之前总是被初始化(在每个代码路径中),那么是的,这很好。在所有其他情况下,你应该初始化你的变量。

cgfeq70w

cgfeq70w4#

在C语言中,从一个被初始化的变量中阅读是一种未定义的行为,所以这是错误的。但是没有理由用它的定义来初始化一个变量。
虽然许多C开发人员习惯于使用其定义初始化自动(局部)变量,但我反对这种做法,并指导我工作的团队不要默认使用其定义初始化自动变量。虽然使用定义初始化变量的目的是避免错误阅读未初始化的数据,但实际上它经常隐藏逻辑错误。
使用现代编译器和代码检查工具(像Sonar,Polyspace,.)你会得到警告和错误,如果你有一个代码路径,它可以读取一个unitialized变量.如果你初始化变量,你会沉默这个有价值的警告.我更喜欢在每一个可能的代码路径和初始化变量,当我真的知道它的预期值,而不是使用一些默认值,这在大多数情况下都是错误的。
考虑一下这样的代码,其中else if分支是通过稍后对函数的编辑添加的:

int m(int a) {
    int res[] = {0, 1, 2};
    int i; /* = 0; */

    if (a < 0) {
        /* do some complicated stuff */
        i = 0;
    } else if (a == 0) {
        /* do some other stuff, we just want to return res[2], but
         * forgot to set i to the appropriate value...
         */
    } else {
        i = 1;
    }

    return res[i];
}

字符串
此代码(没有初始化)将产生一些未定义的行为,这真的很糟糕。* 然而 *,使用现代的编译器或正常的代码检查器,您将在此处获得有关逻辑错误的有价值的警告。通过使用其定义将i初始化为0来消除此警告(这是一种常见的做法)将使此警告静音,您将不得不进行长时间的调试以找到错误;也许在你写了实际代码的几个月后。编译器警告会在你完成这些垃圾操作后几分钟跳出来。

kgqe7b3p

kgqe7b3p5#

如果你有一个被单位化的变量,并且不要试图从它们中读取有意义的值,那么现在不会发生任何不好的事情(你可以读取它们,也不会发生任何不好的事情,但是它们的内容是垃圾)。
但是,初始化尽可能多的变量是一个很好的做法,因为即使你的代码现在可能很好,如果你以后改变它,如果你留下一些变量没有初始化,你可能会引入更难找到错误。
特别是当有很多不同的可能执行路径时,比如多线程/进程/中断。

相关问题