2016-04-27 140 views
0

爲什麼上述3 malloc崩潰?有時他們工作,但僅適用於(globale-> dim_schema)> 10(globale-> dim_schema)> 100c malloc導致崩潰

struct GLOBALE { 

    int dim_schema; 
    char *schema; 
    int *celle_usate; 
    char *punteggi; 
    char *percorso_aiuto; 
    struct LISTA_SOLUZIONI *soluzioni; 
}; 

typedef struct GLOBALE *struct_globale; 

void modalita_interattiva() { 

    int i; 
    char lettera; 

    char bonus; 
    char *parola; 
    struct_globale globale; 
    globale = malloc(sizeof(struct_globale)); 

    if(globale == NULL) { 

     printf("Impossibile creare struct globale\n"); 
     exit(EXIT_FAILURE); 

    globale->soluzioni = NULL; 

    do{ 
     printf("Quanto grande e' lo schema di ruzzle che vuoi usare? (>0)\n"); 
     scanf("%d", &(globale->dim_schema)); 
     printf("Dimensione: %d \n", globale->dim_schema); 
    }while(globale->dim_schema<=0); 

    globale->celle_usate = malloc(globale->dim_schema * globale->dim_schema * sizeof(int)); <----CRASH 
    printf("celle usate\n"); 
    globale->punteggi = malloc((globale->dim_schema) * (globale->dim_schema) * sizeof(char)); <----CRASH 
    printf("punteggi\n"); 
    globale->schema = malloc(globale->dim_schema * globale->dim_schema * sizeof(char));<----CRASH 
    printf("schema\n"); 
...etc etc 
+1

'globale =的malloc(的sizeof(struct_globale)) ;':'struct_globale'是'struct GLOBALE'的指針類型。這應該是'globale = malloc(sizeof(* globale));' – BLUEPIXY

+0

謝謝,我的生活是你的! –

回答

1

這就是爲什麼它不是隱藏內typedef指針一個好主意,一個很好的例子:

globale = malloc(sizeof(struct_globale)); 

struct_globalestruct GLOBALE *的typedef。因此,上面的分配只爲指向struct GLOBALE的指針分配足夠的空間(通常是4或8個字節,具體取決於機器/編譯器)。由於結構大於此,所以您正在寫入超過分配大小的內存偏移量的成員。這導致未定義的行爲。

您需要爲結構的大小分配空間:

globale = malloc(sizeof(struct GLOBALE)); 

或者alternaltely:

globale = malloc(sizeof(*globale)); 
+0

就像我看到的那樣,在類型聲明中「隱藏」一個指針不是問題,但* malloc *的錯誤傾向性是。 –

0

函數調用

malloc(sizeof(struct_globale)) 

只返回的內存區域指針大小struct_globale,no t它所指的記錄的大小。顯然,內存分配與malloc及其堂兄弟相當容易出錯。但是,它可以通過將以下函數宏加以改進:

#define NEW_ARRAY(ptr, n) (ptr) = malloc((n) * sizeof (ptr)[0]) 
#define NEW(ptr) NEW_ARRAY((ptr), 1) 

有了這些在地方,你可以簡單地說

NEW(globale); 
NEW_ARRAY(globale->celle_usate, globale->dim_schema * globale->dim_schema);