2016-01-02 79 views
0

即使未使用malloc,數組是如何創建的?動態數組在沒有malloc的情況下分配

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

int main() { 
    int n,i,*ptr,sum=0; 
    printf("Enter number of elements: "); 
    scanf("%d",&n); 
    printf("Enter elements of array: "); 

    for(i=0;i<n;++i) 
    { 
     scanf("%d",ptr+i); 
     sum+=*(ptr+i); 
    } 

    printf("Sum=%d",sum); 
    free(ptr); 
    return 0; 
} 
+1

如果您在使用它之前沒有'malloc'指針,它*可能*不會生成運行時錯誤,因爲您引用的無效地址可能恰好在您的程序有權訪問的空間內而不會產生訪問衝突。這並不意味着它很好。這仍然是一個錯誤。您應該打開警告消息。 – lurker

+0

我很感激這個答案,這很有趣,你可以拋出更多的信息---「你引用的無效地址可能恰好在你的程序訪問的空間內,而不會產生訪問衝突」 –

+0

如果地址例如,在堆的區域內,這是應用程序允許讀取或寫入的內存,但您可能沒有使用'malloc'正確分配它。 – lurker

回答

2

該數組未被「創建」。它被宣佈。然後它沒有被定義或初始化。你用吧。

未定義的行爲。

如果您使用更嚴格的編譯器,那麼你會得到:

warning: ‘ptr’ may be used uninitialized in this function [-Wmaybe-uninitialized] 

因此,它實際上不是動態

這裏在我看來,更大的問題是與free(ptr)會發生什麼:

這是可能的,但不確定的行爲。由於您傳遞了未初始化的指針,指針的值不清晰。這可能是意外NULL但不限於。

大圖片:

訪問在不確定的行爲任何未初始化變量的結果。

編輯:

OP沒有宣佈一個陣列,而整數指針。

+0

「_It聲明_」 - 我沒有看到OP代碼中聲明的任何數組.. –

+0

@CoolGuy是的,已經聲明瞭一個整型指針。但OP把它稱爲一個數組,這就是爲什麼我保留它。我將編輯我的答案以消除任何含糊之處。 – user8

+1

好的。好。 +1順便說一句。好答案。 –

相關問題