2010-11-18 124 views
1

我目前正在學習使用C編程。在我的任務中的一項任務中,我必須製作一個柱狀圖(通過基本控制檯輸出繪製,如下所示:http://img703.imageshack.us/img703/448/histogram.jpg)來測量文本文件中的字符數這項任務的標準是1.3 MB)。我沒有作出這樣的函數:C中的內存泄漏?

int *yAxisAverageMethod(int average, int max, int min) 
{ 
    int *yAxis; 
    int i=0; 
    for (i=0;i<20;i++) 
    { 
     *(yAxis+i)=0; 
    } 
/* 
    int length=sizeof(data)/sizeof(int); 
*/ 
    int lower_half_interval=average/10; 
    int upper_half_interval=(max-average)/10; 
    int current_y_value=min; 
     for (i=0;i<11;i++) 
     { 
      if (i==10){ 
       *(yAxis+10)=average; 
       break; 
      } 
      *(yAxis+i)=current_y_value; 
      current_y_value+=lower_half_interval;    
     } 
    current_y_value+=average+upper_half_interval; 
    printf("Current y value:%d\n",current_y_value); 
    printf("Current max value:%d\n",max); 
     for (i=11;i<20;i++) 
     { 
       *(yAxis+i)=current_y_value; 
       current_y_value+=upper_half_interval; 
     } 

    return yAxis; 
} 

在這個函數中,我打算要返回的20個整數的數組,以使y軸。我找到所有字符的平均值,然後使用20行控制檯來顯示它。低10行用於顯示總字符數低於平均值的數量,用10行顯示高位部分。下半部分的y軸的每一步計算方法爲(平均 - 分鐘)/ 10,上半部分的y軸中的每一步計算(最大 - 平均)/ 10。這是我繪製直方圖的方法,因爲我想顯示值之間的變體。

在main方法,我有這樣的函數調用:

int *yAxis; 
yAxis=yAxisAverageMethod(average,max,min); 

我得到一個分段錯誤,當我跑的功能。在netbean GCC++編譯器中,它工作正常。 Howerver,當我在大學機器上運行它時(我必須在命令行編譯並在Vi中編輯),我得到了錯誤。我猜這是因爲Netbean有自己的內存管理器?我不明白。

編輯:我會問關於合併排序在其他問題。

+0

將合併排序部分拆分成另一個問題,否則它會變得令人困惑 – 2010-11-18 14:37:48

+0

既然你在學習,那麼就需要一種文體上的評論:使用一個體面的編輯器知道如何爲你縮進代碼。你的'for'循環縮進的方式讓人難以理解。 – nmichaels 2010-11-18 14:38:53

+0

不,Netbeans不會爲您提供內存管理器。但是你真的需要這些函數指針嗎?如果是,至少應該在頂部更改函數聲明,「int * yAxisAverageMethod(...)」是非常不尋常的語法。但要找到內存泄漏,你可以檢查valgrind(memcheck)。如果你使用C/C++進行編程,那麼無論如何都可以使用valgrind來獲得適應性...... ;-) – Philip 2010-11-18 14:39:52

回答

2

* yAxis是一個野指針。你永遠不會爲你想要使用的int數組分配內存。

int *yAxis = malloc(sizeof(int) * 20); 
+0

特別感謝!有用!另外,我仍然需要使它適合合併排序。 – Amumu 2010-11-18 14:43:27

+0

我仍然不明白爲什麼我的netbean編譯器可以運行,但我的大學的機器不能。 – Amumu 2010-11-18 14:58:56

+1

這很容易 - 它取決於操作系統,不同的系統以不同的方式處理內存,並且(可能)不在編譯器本身。在所有的編譯器中,你都有一個指向未定義位置的指針,而且你正在寫這個指針。如果那個位置碰巧是有效的內存,那麼許多操作系統只會讓你寫在那裏,覆蓋那裏的任何東西。這是非常討厭的錯誤的常見原因。一個具有受保護內存的系統會拋出一個異常,因爲它會看到你沒有業務寫入。在C中,你必須處理這些低級別的事情...... – 0xDEADBEEF 2010-11-18 16:01:55

1

您正在返回一個沒有任何內容的指針。

函數裏面是否告訴計算機爲* yAxis保留一些內存?

+0

謝謝。這很有幫助。 – Amumu 2010-11-18 14:44:11

0

yAxis是一個點,你沒有初始化它。它會指向未知空間什麼取決於編譯器。你應該先爲它申請一些內存。

yAxis = malloc(sizeof(int)*20);

0

不要忘記釋放(),它的調用者。