我有这个程序(学校练习),它模拟用于管理测试和练习的软件。一切都工作正常......直到它不起作用。第二次,在程序的菜单中,我想添加一个练习(调用名为 inserisciEsercizio 的函数,英文为“addExercise”),malloc (esercizioPtr newEsercizio = (esercizioPtr )malloc(sizeof (esercizio));) “触发断点”。我附加了函数以及声明结构的位置。 这意味着什么?我该如何解决? 谢谢。
我尝试查找,但找不到任何可以帮助我理解的内容。
这些变量是用意大利语编写的(老实说,一半是意大利语,一半是英语)。希望这不是太大的问题。
struct ListaEsercizi
{
esercizioPtr esercizio;
struct ListaEsercizi *nextListaEsercizi;
};
typedef struct ListaEsercizi listaEsercizi;
typedef listaEsercizi *listaEserciziPtr;
struct Esercizio
{
char titolo[20];
char domanda[40];
char risposte[3][50];
int difficolta;
struct Esercizio *nextEsercizio;
};
typedef struct Esercizio esercizio;
typedef esercizio *esercizioPtr;
void inserisciEsercizio(esercizioPtr *firstEsercizio, autorePtr Autore)
{
listaEserciziPtr newLista = (listaEserciziPtr)malloc(sizeof (listaEsercizi));
esercizioPtr newEsercizio = (esercizioPtr)malloc(sizeof (esercizio)); // <--- here!
//se ne stabiliscono i parametri
if (newEsercizio != NULL)
{
newEsercizio->nextEsercizio = NULL;
printf("Inserisci titolo esercizio ");
scanf_s("%s", newEsercizio->titolo, 20);
printf("Inserisci domanda esercizio: ");
scanf_s("%s", newEsercizio->domanda, 30);
printf("Inserisci difficolta esercizio: ");
scanf_s("%d", &(newEsercizio->difficolta));
for (int i = 0; i < 3; i++)
{
printf(" Scrivere la risposta:\n");
scanf_s("%s", newEsercizio->risposte[i], 100);
}
if (*firstEsercizio == NULL) //caso in cui creo il primo oggetto
{
*firstEsercizio = newEsercizio;
}
else //se non il primo lo inserisco all'interno della lista oggetti
{
newEsercizio->nextEsercizio = *firstEsercizio;
*firstEsercizio = newEsercizio;
}
//mettere malloc
if (newLista != NULL)
{
newLista->nextListaEsercizi = NULL;
newLista->esercizio = newEsercizio;
if (Autore->esercizi == NULL) //caso in cui creo il primo oggetto
{
Autore->esercizi = newLista;
}
else //se non il primo lo inserisco all'interno della lista oggetti
{
newLista->nextListaEsercizi = Autore->esercizi;
Autore->esercizi = newLista;
}
}
else
{
//nel caso malloc restituisca NULL
printf("Memoria non disponibile \n");
}
}
else
{
//nel caso malloc restituisca NULL
printf("Memoria non disponibile \n");
}
}
最佳答案
在您的声明中,您有:
char risposte[3][50];
稍后在代码中您有:
scanf_s("%s", newEsercizio->risposte[i], 100);
它允许 50 个字符的数组中包含 100 个字符,这可能会导致第一次调用 inserisciEsercizio
时内存损坏。使用 sizeof
而不是 scanf_s
中的常量通常是一个好主意:
scanf_s("%s", newEsercizio->risposte[i], sizeof(newEsercizio->risposte[i]));
关于c - C 中 malloc() 触发断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57941903/