2016-04-27 194 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);