gpt4 book ai didi

c malloc 导致崩溃

转载 作者:行者123 更新时间:2023-11-30 15:09:04 25 4
gpt4 key购买 nike

为什么上面的 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 * 的类型定义。因此,上述分配仅为指向 struct GLOBALE 的指针分配足够的空间(通常为 4 或 8 个字节,具体取决于机器/编译器)。由于结构体大于此值,因此您正在写入超出分配大小的内存偏移量的成员。这会导致未定义的行为。

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

globale = malloc(sizeof(struct GLOBALE));

或者:

globale = malloc(sizeof(*globale));

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com