C 如何阻止初始化的整数被给定一个看似随机的特定值?

C 如何阻止初始化的整数被给定一个看似随机的特定值?,c,int,C,Int,我已经在这个项目上工作了一天左右,我没有遇到任何问题,也没有看到过这个问题 它在不起作用之前就已经起作用了…下面是导致问题的代码 当我将变量iflag、vflag和nflag声明为零时,在今天开始工作之前,我得到了可预测的功能。但是现在iflag不知何故是4196496。 #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #define MA

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

它在不起作用之前就已经起作用了…下面是导致问题的代码

当我将变量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
...
}
#包括
#包括
#包括
#包括
#定义最大线长度512
//原型:
字符*读取行(文件*fpntr);
int grep_流(文件*fpntr,字符*string,int iflag,int nflag,int vflag);
int line_number=1;//文件中的行号。
整数宽度=6;//间距
int main(int argc,char*argv[])
{   
FILE*fpntr=NULL;//指针
char*PATTERN=argv[1];//试图与搜索匹配的字符串。
char*FILE_PATH=NULL;//可选文件路径。
int eflag=0;//跟踪错误
int vflag,iflag,nflag=0;//跟踪参数的使用情况。
printf(“在grep_流中\n”);
printf(“iflag:%d\n”,iflag);//输出4196496
printf(“nflag:%d\n”,nflag);//输出0
printf(“vflag:%d\n\n”,vflag);//输出0
...
}
如果这有帮助的话,我可以包含代码的其余部分,但本质上,在我做声明的那一刻,它被设置为一个奇怪的数字,所以我认为其他地方不会有任何令人不安的问题

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

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

这很不幸,但不是。你有责任初始化它。没有一个标准的C特性可以让你利用它来初始化它

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

此代码:

int vflag, iflag, nflag = 0;     // Track param usage.
等同于此代码:

int vflag;
int iflag;
int nflag = 0;     // Track param usage.
需要注意的是,
iflag
vflag
在这里没有初始化


我将来如何避免这个问题? 在我看来,警告和其他静态分析方法对于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.

下面是一个示例,编译器可以在您浪费调试时间之前警告您这些错误。请注意,我删除了
未使用变量
警告,但这只是因为示例代码省略了一些用法。通常,这是一个有用的警告。

在Java和其他一些语言中,值会自动初始化以表示各自类型的“null”,int=0、double=0.0、string=”“等等


这不是C,tho的情况。分配的内存可能包含变量开始时将包含的一些以前的垃圾值,正确初始化取决于您。

您从未初始化过
iflag
vflag
。代码
nflag=0
只初始化
nflag
。对-我想最初我认为这是理所当然的。有没有什么特别的原因使这个问题不会提前出现?我刚刚在相当长的一段时间后遇到了这些问题。是的,原因是这取决于所谓的“未定义的行为”。这通常意味着编译器可以自由选择您认为的快捷方式。它会导致程序的执行可能不一致。根据执行环境的不同,变量行为的一些输入可能是:堆栈或堆上的其他内容,或者在此之前运行过的程序。好的,这更有意义。我从来没有考虑过。谢谢你的详细回答!