2014-02-20 222 views
0

當我編譯此代碼時,它說「錯誤C4700:使用未初始化的局部變量'b'」。我不知道我現在必須做什麼來解決這個問題。我既不是IT學生,也不是技術員,但我非常喜歡學習C++,而且我自己也在學習它。我一直在這一天。C4700:未初始化的局部變量

非常感謝

#include <stdio.h> 
#include <iostream> 

//A. 
//1-- 
void InputArray(int *a, int &n) 
{ 
    printf("Insert n = "); 
    scanf("%d", &n); 
    a = new int[n]; 
    for (int i=0; i<n; i++) 
    { 
     printf("Enter the key's a[%d] values: ", i); 
     scanf("%d",&a[i]); 
    } 
} 


void main() 
{ 
    int *b, m; 
    InputArray(b, m); 
} 
+0

想想'當你把它傳遞給你的函數B'具有價值。 – 2014-02-20 19:20:35

+0

可能的重複[如何最好的沉默關於未使用的變量的警告?](http://stackoverflow.com/questions/1486904/how-do-i-best-silence-a-warning-about-unused-variables) – wasthishelpful

回答

1

如果你想要的功能修改調用者的變量,然後通過引用傳遞:

void InputArray(int *&a, int &n) 
        ^

你的版本經過值未初始化的指針;該功能會修改它的本地副本,但會使b處於未初始化狀態。

+0

可能是真的,但不是問題的答案。 – 2014-02-20 19:20:56

+0

@MikeW:它以什麼方式回答這個問題?該函數顯然是要分配一個數組,並通過引用參數返回基指針和大小。該警告告訴你,這沒有發生,因爲指針是通過值傳遞的,而調用者的變量保持不變。 –

+0

嗨,這兩種方式導致正是我需要在命令提示符。然而,我並沒有真正理解這個差異: (1)void InputArray(int *&a,int&n)它不需要初始化b的值爲NULL >>>>>>>> (2)保留了函數void InputArray(int * a,int&n),然後初始化b >>>>>>>>>>>但無論如何,我非常感謝您的幫助。謝謝你們倆 – Ben

12

b通過值傳遞,這意味着將進行復制,但由於未初始化,因此會收到警告。簡單地將其初始化:

int *b = nullptr; 

int *b = NULL; 
+0

簡直不敢相信那麼簡單!謝謝! – Ben

1

的指針沒有默認初始化,所以你的變量b未初始化,這是錯誤的根源。您必須初始化此變量以解決此問題:

void main() 
{ 
    int *b = NULL, m; 
    InputArray(b, m); 
} 

解決此問題後,您的代碼中存在其他問題。從你調用一個函數的方式來看,你希望持久地改變指針b傳遞給它,這樣b將在函數返回後指向分配了new的內存。但是按值傳遞指針意味着函數所做的更改不會反映在原始變量b中,該變量仍將指向調用函數之前指向的內容。 (該數組將在函數內部分配,並在函數返回後保留在內存中,但您將泄漏該內存,因爲b不會指向它)。爲了解決這個問題,你必須pass pointer by reference

void InputArray(int*& a, int& n) 

另外:這裏是delete?記住:映射newdelete是雙向注入:每個new對應於放置在代碼中的單個delete

+0

嗨@piotrus,感謝您的回答,但是 (1)void InputArray(int *&a,int&n)不需要初始化b的值爲NULL並且(2)保留函數void InputArray(int * a,int&n),然後初始化b。 不好意思問這種新手問題,但對我來說這個指針太難理解了。 – Ben

+0

@ user3247523初始化b後綴是什麼意思? &需要通過引用來獲取指針,以便改變傳遞給原函數的指針而不是本指針的本地副本,[這裏](http://www.codeproject.com/Articles/4894/Pointer-to-Pointer-和參考指針),你會發現這解釋了例子 – 4pie0

-1

首先,你學會了如何正確使用指針嗎?因爲如果你知道如何使用指針,你應該知道,當你聲明一個指針時,你需要初始化爲NULL,然後才能使用它,如果我錯了,請糾正我。

int *b = nullptr; 
int *b = NULL; 
int *b = 0; 
int *b(0); 

這都是同樣的事情,但在一個不同的方式

+1

你不需要初始化一個空值的指針:你需要初始化它的值可能是或不可以爲null,你可以'在某種意義上你不能使用空指針來解引用它。而且,在大多數編譯器中'NULL'是'0'的別名。另一方面,'nullptr'是一個真正的指針類型,不同於'NULL'和'0' – wasthishelpful