2017-08-04 199 views
-1

我已經通讀了大量的帖子,給出了可以從函數返回int類型數組的方法。我試圖按照使用malloc()函數動態分配函數內部的方法。從函數返回int類型數組的問題

在示例代碼中,我使用的函數foo計算的數組中的峯值大於指定值。

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

/* function declaration */ 
int *foo(int arr[],int size); 
int main() 
{ 
int test[] = {1,2,1,4,5,2,7,8,9,1}; //array of test data. 
int *p; 
p = foo(test,10); 
int w; 
for(w=0;w<5;w++) 
    { 
     printf(" Peak %d\t",p[w]); // This line is giving a non sensible answer. 
    } 
    free(p); // free the memory 

return 0; 
} 

int *foo(int arr[],int size) { 
    int j; 
    int Peak_min = 3; // Minimum peak height 
    int *ret = malloc(size * sizeof(*ret)); 
    if(!ret) return 1; 
    for (j = 0; j < size -1; ++j) 
    { 
     if ((arr[j] < arr[j+1]) && (arr[j+1] > arr[j+2]) && (arr[j+1] > Peak_min))// Peak criteria 
     { 
      ret[j] = arr[j+1]; 
      printf(" Peak_No %d",ret[j]); // This line is giving the correct output.    
     } 
    } 
    return ret; 
} 

按照預期,函數中打印的輸出爲5和9。但是,當我調用int main()中的函數時,輸出會提供不合理的值。我正在努力尋找與我的代碼錯誤,關於如何調試/修復此問題的任何建議?

更新

我編輯在溫控功能FOO for循環

for (j = 0; j < size -2; ++j) 
    { 
     if ((arr[j] < arr[j+1]) && (arr[j+1] > arr[j+2]) && (arr[j+1] > Peak_min))// Peak criteria 
     { 
      ret[j] = arr[j+1]; 
      printf(" Peak_No %d",ret[j]); // This line is giving the correct output. 
     } 
     else 
     { 
     ret[j] = 0; 
     } 
    } 

現在我得到我想要的輸出。

+0

如果'foo'函數中的分配失敗,您應該返回一個空指針。 –

+0

因此將返回值1更改爲NULL? – Sjoseph

+1

至於問題的一個部分,當'j'等於'size-2'時,當你做'arr [j + 2]'時會發生什麼? –

回答

3

malloc()返回單元化內存。

函數內部,ret[j]的賦值是有條件的。你永遠不知道哪個或哪個索引元素被實際初始化。在返回指針之後,你無條件地索引任何指針來讀取可能被很好地單元化的值。

如果您使用相同的賦值條件返回指針,則至少可以使用calloc(),它將返回0填充的內存,所以至少您有一個確定性值。但是,這將無法區分剩餘索引元素和實際值爲0的元素。爲了獲得更高的精度,您可以將memset() -ed內存設置爲某個保護值,以指示未分配這些節點值。

此外,另一個quickfix會,添加一個else條件,基本上有助於無條件地爲每個元素賦值。

+0

你能解釋一下嗎?我如何修改這個以確保值始終被初始化? – Sjoseph

+0

@Sjoseph現在好多了? –

+0

我對內存分配非常陌生,因爲直到最近我才真正使用過MATLAB!我正在慢慢地開始吸收信息,現在將在memset()和calloc()上進行閱讀。 – Sjoseph

0

似乎循環必須是:

int k= 0; 
    for (j = 0; j < size -2; ++j) 
    { 
     if ((arr[j] < arr[j+1]) && (arr[j+1] > arr[j+2]) && (arr[j+1] > Peak_min))// Peak criteria 
     { 
      ret[k++] = arr[j+1]; 
     } 
    } 
    ret[k]= 0; 
    return ret; 
} 

,並在主:

int w= 0; 
    while (p[w]) printf(" Peak %d\t",p[w++]); 

這將創建峯列表,用一個空項終止。

+0

我試圖實現上述改變,似乎陷入了無限循環! – Sjoseph

+0

哎呀,是的,無限循環。應該是'printf(「Peak%d \ t」,p [w ++]);'注意'++'。難道你不能發現和解決它自己? –

+0

我選擇了原來的嘗試,但感謝您的有用評論 – Sjoseph