c - C 中 malloc() 触发断点

标签 c malloc

我有这个程序(学校练习),它模拟用于管理测试和练习的软件。一切都工作正常......直到它不起作用。第二次,在程序的菜单中,我想添加一个练习(调用名为 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/

相关文章:

c - malloc 提供了哪些关于低阶位的保证?

c - 如何在linux中将UID/GID映射到用户名/组名

c - 放置常量的最佳位置

c - 将动态创建的结构体作为非指针对象返回

c - malloc 错误处理

c - 需要类型为 'int' 的参数,但参数 2 的类型为 'int **'

c - 固定大小类型的动态分配

c - 在不使用 shell 的情况下在 C 中运行程序

c - Linux 上的 betoh16/32 和 letoh16/32 的名称是什么?

c - 使用 "core clock cycles"的 Intel CPU 上的时序代码?