2010-04-26 33 views
1

I的結構所定義的結構,如下所示:異常上的malloc在C

typedef struct { 
int n; 
int *n_p; 
void **list_pp; 
size_t rec_size; 
int n_buffs; 
size_t buff_size 
} fl_hdr_type; 

和在我的代碼我有一個函數,該函數具有以下

fl_hdr_type *fl_hdr; 
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n)); 

initlialization其中那些緩衝大小被傳遞給函數以允許緩衝區的空間。

大小是非常小的通常..100 * 50或類似的..這個系統上的內存分配給它。 我不能真正張貼堆棧跟蹤,因爲這個代碼是另一個網絡上,但是從dbx中的核心文件拉到一些信息:

buff_size_n = 32,rec_size_n = 186

和stack..line來自malloc.c的數字

t_splay:861 
t_delete:796 
realfree: 531 
cleanfree:945 
_malloc:230 
_malloc:186 

任何想法爲什麼會失敗?

+0

buff_size_n和rec_size_n失敗時的具體值是什麼?當它失敗,崩潰或malloc返回NULL或..時會發生什麼? – nos 2010-04-26 17:24:45

+2

你確定這是對'malloc'的調用失敗嗎? 「buff_size_n」或「rec_size_n」可能是負值嗎?您是否嘗試用例如'malloc(sizeof(...)+ ...)'替換'malloc '的malloc(5000)'? – stakx 2010-04-26 17:26:31

+4

c沒有例外 – 2010-04-26 17:31:06

回答

8

嘗試通過valgrind運行您的程序,查看它報告的內容。在程序的某些其他部分中,可能會損壞空閒列表或malloc查看的其他內容。

+4

+1如果程序在*'malloc'內部發生崩潰*,則幾乎可以確保您已將堆損壞到其他地方。 – 2010-04-26 17:39:00

0

你需要做的只是做到這一點。

fl_hdr = malloc(sizeof(fl_hdr_type)); list_pp是void *的一個動態數組,您需要使用另一個malloc將其分配給所需的大小。

list_pp只是一個指向其他堆的指針。

如果你想分配一個malloc,那麼你需要將它定義爲一個你想要的實際類型的數組。編譯器需要知道能夠執行分配的類型。

如果你正在尋找的是動態數組在C,then look at this

+0

此外,您需要這樣做來縮小問題的原因。 – Puppy 2010-04-26 17:40:42

+0

更新OP與進一步的細節 – Derek 2010-04-26 17:58:56

0

我把你的例子變成了一個程序,並且完全沒有運行它的問題。如果你可以編譯並運行這個簡單的代碼(並且它可以工作),那麼你的程序中的其他地方就已經損壞了堆。請運行它通過Valgrind編輯User275455建議,我沒有注意到答覆)並更新您的問題與它給你的輸出。

編輯

另外,請更新您的問題,表示正是你分配結構後**list_pp*n_p做什麼。如果您無法訪問valgrind,則至少應粘貼程序崩潰時glibc打印的整個跟蹤。

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

typedef struct { 
int n; 
int *n_p; 
void **list_pp; 
size_t rec_size; 
int n_buffs; 
size_t buff_size; 
} fl_hdr_type; 

static size_t buff_size_n = 50; 
static size_t rec_size_n = 100; 


static fl_hdr_type *my_init(void) 
{ 
     fl_hdr_type *fl_hdr = NULL; 
     fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n)); 

     return fl_hdr; 
} 

int main(void) 
{ 
     fl_hdr_type *t = NULL; 

     t = my_init(); 

     printf("Malloc %s\n", t == NULL ? "Failed" : "Worked"); 

     if (t != NULL) 
      free(t); 

     return 0; 
} 
+0

更新OP與我可以從核心文件中得到的細節,但我們沒有在該系統valgrind ..將不得不很快研究 – Derek 2010-04-26 17:59:21

+0

如果你自己運行這個程序失敗? – 2010-04-26 18:07:02

+0

@Derek - 查看我的編輯。 – 2010-04-26 18:30:25

0

你需要明確指定n_plist_pp到適當的補償。

fl_hdr_type *fl_hdr; 
fl_hdr = malloc(sizeof(fl_hdr_type) + (buff_size_n * rec_size_n)); 
fl_hdr->n_p = fl_hdr+sizeof(fl_hdr_type); 
fl_hdr->list_pp = fl_hdr->n_p + (num_n * sizeof(int)); 

如果你打算這樣做,我建議把指針放在struct結尾,而不是中間。不過,我與Romain合作,並建議您使用單獨的電話撥打malloc(),而不是通過一次呼叫抓取所有內容。

+0

在一次調用中分配所有內容有助於減少堆碎片。而且,它更有效率。這些並不是自己的首要原因,但它們在某些情況下可能變得重要。如果你採用單分配方法,你需要確保'* fl_hdr'後面的內存被正確對齊,無論它包含什麼。 – 2010-04-26 18:30:45