c malloc导致崩溃
问题描述:
为什么上述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
答
这就是为什么它不是隐藏内typedef
指针一个好主意,一个很好的例子:
globale = malloc(sizeof(struct_globale));
struct_globale
是struct GLOBALE *
的typedef。因此,上面的分配只为指向struct GLOBALE
的指针分配足够的空间(通常是4或8个字节,具体取决于机器/编译器)。由于结构大于此,所以您正在写入超过分配大小的内存偏移量的成员。这导致未定义的行为。
您需要为结构的大小分配空间:
globale = malloc(sizeof(struct GLOBALE));
或者alternaltely:
globale = malloc(sizeof(*globale));
+0
就像我看到的那样,在类型声明中“隐藏”一个指针不是问题,但* malloc *的错误倾向性是。 –
答
函数调用
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);
等
'globale =的malloc(的sizeof(struct_globale)) ;':'struct_globale'是'struct GLOBALE'的指针类型。这应该是'globale = malloc(sizeof(* globale));' – BLUEPIXY
谢谢,我的生活是你的! –