2016-03-13 19 views
2

我一直在做這個程序一天左右,現在我沒有任何問題,也沒有看到之前的特定問題。如何停止初始化整數被賦予一個看似隨機的特定值?

它之前工作只是沒有工作......下面是導致問題的代碼。

當我將我的變量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

您從未初始化過'iflag'或'vflag'。代碼'nflag = 0'只初始化'nflag'。 –

回答

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警告,但僅僅是因爲您的示例代碼省略了一些用法。通常情況下,這可能是一個有用的警告。

+0

對 - 我想我最初理所當然地認爲它是理所當然的。有沒有什麼特別的原因可以解決這個問題呢?我現在剛剛在相當一段時間後遇到了這些問題。 –

+1

是的,原因是這取決於「未定義的行爲」。它通常意味着編譯器可以自由地採取您可能認爲的快捷方式。它導致程序的執行可能不一致。根據執行環境的不同,對變量行爲的一些輸入可能是:堆棧或堆中剩下的其他東西,或者在此之前運行的程序。 –

+0

好的 - 這樣做更有意義。我從來沒有考慮過它。感謝您的詳細解答! –

2

在Java和其他一些語言中,值會自動初始化以表示它們各自類型的'null',int = 0,double = 0.0,string =「」等等。

這不是在C,tho的情況。分配的內存可能包含一些先前的垃圾值,變量將在開始時包含這些垃圾值,這取決於您是否正確初始化它。

相關問題