2013-04-17 49 views
2

這個小程序有什麼問題?我無法得到正確的答案。我只是用m [1] [1]來測試,但它總是0!如何使用memset初始化動態二維數組?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int main() 
{ 
    int **m; 
    m = new int*[5]; 
    for(int i = 0 ; i < 5; i++) 
    { 
     m[i] = new int[5]; 
     memset(m[i],1,sizeof(int)*5); 
    } 

    printf("%f",*(*(m+1)+1)); 
    return 0; 

} 
+1

將錯誤的類型傳遞給可變參數是未定義的行爲。 – chris

+0

'fill(a,a + 5,5)' – gongzhitaao

回答

4

這是「不是C++」。是的,這是一個C++代碼,但它沒有使用合理的C++習慣用法 - 你在混合使用C風格memset和指針追逐operator new(這是你使用的唯一C++特性)。因此,我會假設你有這樣的代碼使用的理由。如果你沒有,請認真考慮使用一些STL類,如vector,並避免指針操作。

如果你使用一個合理的編譯器和添加合理的警告,你會立刻得到錯誤:

$ g++ -Wall pwn.cpp 
pwn.cpp: In function ‘int main()’: 
pwn.cpp:14:28: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘int’ [-Wformat] 

正確的參數printf打印整數爲%d。改變之後它的外觀如何?

$ ./a.out 
16843009 

它怎麼不打印1?函數設置內存,它不初始化整數。確實,0x01010101 == 16843009。這不是可移植的,很可能不是你想要做的。只是不要這麼做,認真。

+0

非常清楚,非常感謝,我會用vector來代替。 –

+1

調用函數之後聲明變量也是C++。 'for(int i = 0; i <5; i ++)'在C中無效,因爲你不能在那裏聲明'i'。 – Havenard

+0

考慮閱讀關於std :: fill的內容。 – Etherealone