2015-03-25 47 views
-1

道歉的真正糟糕的問題 - 我真的不知道該怎麼說。 我正在執行一段代碼,我試圖使用動態數組。這是段錯誤 - 荷蘭國際集團在這一行:Segfault使用動態數組

void myFunction(....) { 
    // other code up here 
    Stack *s = stack_new(); //segfault here 
} 

爲我的結構相關的頭文件是:

typedef struct { 
    void **A; 
    int size; 
    int top; // the index of the current top of the stack 
} Stack; 

和功能stack_new()是:

Stack 
*stack_new() { 
    Stack *s; 
    s->size = 1; 
    s->top = -1; 
    s->A = (void **)malloc(s->size); 
    return s; 
} 

我想我已經包含了所有相關的內容,但如果您需要更多代碼,請告訴我們。

我認爲問題出在我使用malloc的方式,但在線搜索並嘗試了幾個不同的選項,仍然收到段錯誤。有人能夠提供一些見解嗎?

謝謝你滿口

+2

勿投'malloc'。 – 2015-03-25 11:37:47

+2

你在'stack_new()'中爲's'分配了什麼內存? – 2015-03-25 11:38:13

+2

和一個爲什麼你不應該''malloc'返回值的鏈接:http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – juhist 2015-03-25 11:39:05

回答

4

這是你的問題:

Stack *s; 
s->size = 1; 

你沒有真正分配Stacks未初始化並指向內存中的任意位置。那麼s->size顯然會失敗。

嘗試:

Stack *s = malloc(sizeof(*s)); 
if (s == NULL) 
{ 
    fprintf(stderr, "Memory allocation error\n"); 
    exit(1); 
} 
s->size = 1; 

注意:您也應該檢查是否s->ANULL。如果是,請返回錯誤代碼(例如NULL),然後記住要釋放您分配的Stack,或者輸出錯誤消息並退出程序。如果退出該程序,操作系統將回收所有使用的內存,因此不需要明確地執行此操作。

另注:做

s->size = 1; 
s->top = -1; 
s->A = (void **)malloc(s->size); 

時......你分配的內存1個字節,即使你應該分配sizeof(void*)字節的內存。試試做

s->A = (void **)malloc(s->size*sizeof(void*)); 

改爲。

+0

我不同意@RickyMutschlechner,它的sizeof(* s)'不是'sizeof(s)''。這個答案對我來說很好。 – 2015-03-25 11:42:48

+0

@Maxime剛剛檢查過,我認爲這是正確的(你/回答者說的) – 2015-03-25 11:43:57

+1

什麼'Stack * s'的意思本質上就是'* s'是一個'Stack',遵循聲明遵循使用原則。所以,這是正確的。 'malloc(sizeof(s))'將會是4或者8個字節,這取決於32位/ 64位的arch,因爲's'是一個'Stack *' – juhist 2015-03-25 11:44:44

2

這是你的第一個問題:

Stack *s; 
s->size = 1; 

你有什麼實際期望的s值是在這一點?它可以從字面上任何東西。如果結構本身尚未分配,則不能設置結構的字段。

嘗試:

Stack *s = malloc(sizeof(*s)); 
if(!s){ 
    //... error checking/exiting .. 
} 

,然後一切你在幹什麼。

+0

修復了答案中的一些錯別字。 – 2015-03-25 11:39:37

+0

謝謝!所以問題是我試圖訪問s,當我沒有真正分配它的內存時,對吧?這是否意味着在以後使用realloc時,我也應該重新分配s(而不是s-> A)? – KittiCat 2015-03-25 11:49:09

+0

@KittiCat是的!究竟。 – 2015-03-25 12:51:35

1

您正在訪問未初始化的指針!

Stack 
*stack_new() { 
    Stack *s = std::nullptr; // initialize this pointer with nullptr 
           // and then you will see later (one line 
           // beyond) that you will try to access a 
           // null pointer 
    s->size = 1; // the problem occurs here!! 
       // you are accessing a pointer, for which has never 
       // been allocated any memory 
    s->top = -1; 
    s->A = (void **)malloc(s->size); 
    return s; 
} 

你將不得不使用「malloc」來爲這個指針分配一些內存。 ......像這樣被這兩條線之間的失蹤,我說:

堆棧

*stack_new() { 
    Stack *s = (Stack*)malloc(sizeof(Stack)); 
    s->size = 1; 
    s->top = -1; 
    s->A = (void **)malloc(s->size); 
    return s; 
} 
+0

'std :: nullptr'在C? – halex 2015-03-25 11:46:15

+0

請刪除所有的演員...這是C,而不是C++。 – 2015-03-25 11:46:33