我已经在这个项目上工作了一天左右,我没有遇到任何问题,也没有看到过这个问题。
它在它没有工作之前工作......下面是导致问题的代码。
当我将变量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
...
}
我可以包含剩下的代码,如果这会有所帮助,但基本上我做声明的那一刻它被设置为奇怪的数字,所以我不认为在其他地方可能有任何问题导致问题。
有没有办法阻止这种情况发生?
答案 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.
至关重要的是要注意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.
以下是编译器在浪费时间调试之前可以警告您这些错误的示例。请注意,我审查了unused-variable
警告,但仅仅是因为您的示例代码省略了一些用法。通常情况下,这可能是一个有用的警告。
答案 1 :(得分:2)
在Java和其他一些语言中,值会自动初始化以表示&#39; null&#39;它们各自的类型,int = 0,double = 0.0,string =&#34;&#34;等等。
在C中不是这种情况。分配的内存可能包含变量将在开始时包含的一些以前的垃圾值,并由您自行初始化它。