如何停止给定看似随机的特定值的初始化整数?

时间:2016-03-13 22:37:12

标签: c int

我已经在这个项目上工作了一天左右,我没有遇到任何问题,也没有看到过这个问题。

它在它没有工作之前工作......下面是导致问题的代码。

当我将变量iflag,vflag和nflag声明为零时,我在今天开始工作之前获得了可预测的功能。但现在 iflag不知何故是4196496。

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

#define MAX_LINE_LENGTH 512

//Prototypes:
char *read_line(FILE *fpntr);
int grep_stream(FILE *fpntr, char *string, int iflag, int nflag, int vflag);

int line_number = 1;             // Line number in the file.
int width = 6;                   // Spacing

int main(int argc, char *argv[])
{   
    FILE *fpntr = NULL;              // Pointer
    char *PATTERN = argv[1];         // String we are attempting to match with our search.
    char *FILE_PATH = NULL;          // Optional file pathway.
    int eflag = 0;                   // Track errors
    int vflag, iflag, nflag = 0;     // Track param usage.

    printf("Inside the grep_stream \n");
    printf("iflag: %d\n", iflag);    // Outputs 4196496
    printf("nflag: %d\n", nflag);    // Outputs 0
    printf("vflag: %d\n\n", vflag);  // Outputs 0
...
}

我可以包含剩下的代码,如果这会有所帮助,但基本上我做声明的那一刻它被设置为奇怪的数字,所以我不认为在其他地方可能有任何问题导致问题。

有没有办法阻止这种情况发生?

2 个答案:

答案 0 :(得分:5)

  

有没有办法阻止这种情况发生?

很不幸,但没有。您有责任对其进行初始化。您可以利用C的标准功能来为您初始化它。

  

当我将变量iflag,vflag和nflag声明为零时,我在今天开始工作之前获得了可预测的功能。但现在iflag不知何故是4196496。

此代码:

int vflag, iflag, nflag = 0;     // Track param usage.

等同于此代码:

int vflag;
int iflag;
int nflag = 0;     // Track param usage.

至关重要的是要注意iflagvflag未在此初始化。

将来如何避免此问题?

在我看来,警告和其他静态分析方法对于C / C ++的生产力至关重要。

$ clang -Wall -Wno-unused-variable uninit.c 
uninit.c:25:27: warning: variable 'iflag' is uninitialized when used here [-Wuninitialized]
    printf("iflag: %d\n", iflag);    // Outputs 4196496
                          ^~~~~
uninit.c:22:21: note: initialize the variable 'iflag' to silence this warning
    int vflag, iflag, nflag = 0;     // Track param usage.
                    ^
                     = 0
uninit.c:27:29: warning: variable 'vflag' is uninitialized when used here [-Wuninitialized]
    printf("vflag: %d\n\n", vflag);  // Outputs 0
                            ^~~~~
uninit.c:22:14: note: initialize the variable 'vflag' to silence this warning
    int vflag, iflag, nflag = 0;     // Track param usage.
             ^
              = 0
2 warnings generated.

以下是编译器在浪费时间调试之前可以警告您这些错误的示例。请注意,我审查了unused-variable警告,但仅仅是因为您的示例代码省略了一些用法。通常情况下,这可能是一个有用的警告。

答案 1 :(得分:2)

在Java和其他一些语言中,值会自动初始化以表示&#39; null&#39;它们各自的类型,int = 0,double = 0.0,string =&#34;&#34;等等。

在C中不是这种情况。分配的内存可能包含变量将在开始时包含的一些以前的垃圾值,并由您自行初始化它。