2011-07-18 23 views
0

爲什麼這樣會導致段錯誤?我的最愛Segfault !!爲什麼?

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


struct node 
    { 
     double d; 
     int *array; 
     char c; 
    }; 



    void allocator(struct node *ptr) 
    { 
     int *tmp; 
     tmp = (int*)realloc(ptr, 10); 
     if(!tmp) 
     { 
     ptr->array=tmp; 
     ptr->array[0] = 23; 
     } 
    } 


    int 
    main() 
    { 
     struct node *ptr = (struct node*)malloc(sizeof(struct node)); 
     ptr->c = 'y'; 
     allocator(ptr); 

     printf(" %c\n", ptr->c);  
     printf(" %d\n", ptr->array[0]); 
     return 0; 
    } 

我得到的印象好像realloc的()中的分配部的功能分配內存,這也映射到在主的malloc()分配的內存..

但這是如何發生的? ?不是內存管理器(我猜這裏是lib(stdlib))跟蹤進程中的空閒空間和分配空間嗎?

+2

如果realloc移動指針,即分配器中的「tmp」與「ptr」不同,那麼在調用函數(main)中,ptr不再是有效的指針。您需要將更改後的指針返回到main。 –

+0

是啊真正的......但我試圖重新分配int指針數組而不是結構節點本身....即realloc(ptr-> darray,10)在一小時左右努力掙扎......只能發現這個愚蠢的錯誤解決它後收到評論在這裏感謝反正 – raja

回答

6

你的struct node然後realloc它阿婷10個字節,然後訪問該成員c其中,由於node結構,可能是過去的第10個字節分配空間不夠。這會導致段錯誤。另外,如果誰決定決定是否需要移動內存塊,realloc會返回一個指向新位置的指針,但在main中的指針仍然指向已被回收的舊塊。這也可能導致段錯誤。

此外,在此代碼:

int *tmp; 
tmp = (int*)realloc(ptr, 10); 
if(!tmp) 
{ 
    ptr->array=tmp; 
    ptr->array[0] = 23; 
} 

如果!tmp,你訪問一個NULL指針,因爲你要指定tmpptr->array然後訪問第0個元素。這也可能導致段錯誤。

你的代碼有很多問題。您可能需要重寫大部分內容。

+0

嗯似乎是一個很好的理由..感謝 – raja

+1

嗯發現問題....應該是realloc(ptr-> darray,10) – raja

1

與此問題是訪問未分配指針的嘗試,這恰好在主:

的printf( 「%d \ n」 個,ptr->陣列[0]);

您的分配函數爲ptr分配空間,ptr是一個結構,但不是該結構中的數組。可能這不是你想要做的(註釋你的代碼!)。

相關問題