为什么上面的3个malloc崩溃?有时它们起作用,但仅适用于(globale-> dim_schema)> 10或(globale-> dim_schema)> 100

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

最佳答案

这是一个很好的示例,说明为什么在typedef中隐藏指针不是一个好主意:

globale = malloc(sizeof(struct_globale));
struct_globalestruct GLOBALE *的typedef。因此,上述分配仅为struct GLOBALE的指针分配了足够的空间(通常为4或8个字节,具体取决于机器/编译器)。由于该结构大于此结构,因此您将写入超出分配大小的内存偏移量的成员。这导致 undefined 的行为。

您需要为结构的大小分配空间:
globale = malloc(sizeof(struct GLOBALE));

或完全是:
globale = malloc(sizeof(*globale));

关于c - c malloc导致崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36896223/

10-09 07:53