【问题标题】:c malloc cause a crashc malloc 导致崩溃
【发布时间】:2016-04-27 16:58:13
【问题描述】:

为什么上面的 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

【问题讨论】:

  • globale = malloc(sizeof(struct_globale)); : struct_globalestruct GLOBALE 的指针类型。这应该是globale = malloc(sizeof(*globale));
  • 谢谢,我的命是你的!

标签: c struct crash malloc


【解决方案1】:

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

globale = malloc(sizeof(struct_globale));

struct_globalestruct GLOBALE * 的类型定义。所以上面的分配只为指向struct GLOBALE的指针分配了足够的空间(通常是4或8个字节,具体取决于机器/编译器)。由于结构大于此,您正在写入超过分配大小的内存偏移量的成员。这会导致未定义的行为。

你需要为结构体的大小分配空间:

globale = malloc(sizeof(struct GLOBALE));

或者:

globale = malloc(sizeof(*globale));

【讨论】:

  • 在我看来,在类型声明中“隐藏”指针不是问题,但 malloc 的错误倾向是。
【解决方案2】:

函数调用

malloc(sizeof(struct_globale))

只返回指针struct_globale大小的内存区域,而不是它所引用的记录的大小。显然,使用 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);

等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 2011-09-23
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多