2014-02-15 53 views
0

我需要製作一個簡單的程序,使得由第一個數組的sqrt-ed元素構成的新數組成爲可能。我必須在main中編寫新數組的元素。我試圖調試我的代碼,並且變量xy顯示了很好的數字(我只初始化它們以便我可以在調試器上觀察進度),但是當我嘗試寫入新數組的元素時,它顯示了一些奇怪的數字。一些好的靈魂能解釋我做錯了什麼嗎?C打印雙類型指針值不起作用

void returnSqrtArrayt(int* myArray, int length, double** newArray) 
{ 
    int i; 
    double x, y; 
    double* p; 
    double* arraySqrt=(double*)malloc(length*sizeof(double)); 
    for(i=0;i<length;i++) 
    { 
     x=*myArray; 
     *arraySqrt=sqrt(x); 
     y=*arraySqrt; 
     myArray++; 
     arraySqrt++; 
    } 

    *newArray=arraySqrt; 

    p=arraySqrt; 

    for(i=0;i<length;i++) 
    { 
     printf("%e\n",*p); 
     p++; 
    } 
    printf("\n"); 
} 

void main() 
{ 
    int myArray[5]={4,2,16,4,81}; 
    int length=sizeof(myArray)/sizeof(int); 
    int i; 
    double* newArray; 

    returnSqrtArrayt(myArray, length, &newArray); 

    for(i=0;i<length;i++) 
    { 
     printf("%e\n",*newArray); 
     newArray++; 
    } 
} 
+0

'雙* arraySqrt =(雙*)malloc的(長*的sizeof(雙));'是不正確的。這是[不投射malloc的返回值](http://stackoverflow.com/a/954785/817643)的好理由。 – StoryTeller

+0

你不應該這樣做'newArray ++;',你馬上就會失去對你的malloc()'內存的引用,並且你不能再次使用這些元素,除非你備份。 –

+1

@StoryTeller:除了演員陣容外,'malloc()'調用也沒問題。 –

回答

2

你體驗什麼是不確定的行爲因爲你做的是:

void returnSqrtArrayt(int* myArray, int length, double** newArray) 
{ 
    ... 
    double* arraySqrt= malloc(...);   // create new array 

    for(i=0;i<length;i++) 
    { 
     ... 
     arraySqrt++;      // increment pointer to this array 
    } 

    *newArray=arraySqrt;     // use incremented pointer 

    // any use of *newArray or arraySqrt here tries to access incorrect memory ! 
} 
這是很好的,你使用的臨時指針 p印刷,因爲遞增 p不影響原來的指針,但嘗試以下變化:
  • *newArray=arraySqrt;後立即malloc致電
  • 代替p=arraySqrt;使用p=*newArray;,而你的函數內部打印
+0

非常感謝!像現在的魅力:) –

+0

@MahirDuraković:不客氣:) – LihO