2012-10-08 82 views
1

我有一段代碼存在問題,所以我儘可能地減少了它,事實上我找到了解決方案來解決我的問題,米幾乎肯定有更好的解決方案,這就是爲什麼我要求幫助。在動態數組結構上使用realloc時發生Segfault錯誤

這裏是不好的代碼:

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

typedef struct{ 
    int a; 
}my_struct; 

void tab_add(my_struct** tab, int i){ 
    *tab = (my_struct*)realloc(*tab, i+1); // Here's the realloc 

    printf("Adding struct number %d\n", i); 
    tab[i]->a = i*8; // Problem here, when accessing tab[i] the second time 
    printf("Struct added\n"); 
} 

int main(void){ 
    my_struct* tab = NULL; 

    tab_add(&tab, 0); 
    tab_add(&tab, 1); 
    tab_add(&tab, 2); 

    return 0; 
} 

的輸出是:

添加結構編號0
STRUCT加入
添加結構數1
zsh的:分段故障./main

現在,這裏是解決該問題的代碼(但它創建了一個無用的變量...):

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

typedef struct{ 
    int a; 
}my_struct; 

void tab_add(my_struct** tab, int i){ 
    *tab = (my_struct*)realloc(*tab, i+1); 

    printf("Adding struct number %d\n", i); 
    my_struct st; // Useless variable created 
    st.a = i*8; 
    (*tab)[i] = st; 
    printf("Struct added\n"); 
} 

int main(void){ 
    my_struct* tab = NULL; 

    tab_add(&tab, 0); 
    tab_add(&tab, 1); 
    tab_add(&tab, 2); 

    return 0; 
} 

它的輸出是正確的:

添加結構數0
結構添加
加入結構數1
STRUCT加入
添加結構數2
STRUCT加入

感謝您的閱讀:)

回答

2

您應該使用

(*tab)[i].a = i*8; 

訪問字段a

+0

它的工作原理!謝謝。我真的認爲編譯器正在用(* tab)[x] .x代替tab [x] - > b!它究竟發生了什麼變化? – user1729422

+0

'tab [x] - > b'是'(* tab [x])。b'不是'(* tab)[x] .b' –

+0

好的,謝謝:) – user1729422

1

realloc手冊頁。第二個參數是你想要分配的數據的大小;我想你是在傳遞一個數組索引。

的代碼應該是理想的形式

my_struct* tmp = realloc(*tab, sizeof(my_struct) * (i+1)); 
if (tmp == NULL) { 
    /* error handling goes here */ 
else { 
    *tab = tmp; 
} 

,以應對realloc的失敗並返回NULL。如果你想擺脫ST的

(*tab)[i].a = i*8; 

1

這是爲使這一分配新建分配FY一樣簡單。

0

不知道你在這裏試圖達到什麼目的。根據realloc文檔,儘可能增加分配空間的大小,如果不是,它就像free和malloc一樣。所以在你的情況下,如果你想爲結構分配一個空間,每次都是一樣的。但根據代碼,它是第一次0字節,它會嘗試釋放(分配的內存是沒有的,seg故障也是如此)。

另外你說的是修復似乎不是一個修復。它會在稍後的某個時刻死亡。因爲堆棧在第一次調用時已經損壞。