0

所以我正在开发一个小 C 程序,它是一个小地址簿,当您在其中添加新联系人时,它会自动分配内存。

我使用了两个 typedef 结构,第一个存储联系人的信息(姓名电话等):

typedef struct
{
    char nom[TAILLE1];
    char tel[TAILLE2];
} CONTACT;

第二个包含一个 int,其中包含地址簿中的联系人数量,另一个是指向另一个结构的指针。

typedef struct
{
    int nb;
    CONTACT * contacts; // tableau
} LISTE_TABLEAU; 

我创建了一个从 TXT 文件中导入联系人的函数(第一行是人名,第二行是他们的电话号码,依此类推)。我只用基本的简化了它

int lireDonneesTxt(LISTE_TABLEAU* tab)
{
    int i;
    tab->contacts = (CONTACT *)malloc(sizeof(CONTACT)*13); (13 because there are 13 contact for testing purposes)
    i = 0;

    while( !feof(entree) )
    {
        fgets(ligne, TAILLE1, entree);
        strcpy(tab->contacts[i].nom, ligne);

        fgets(ligne, TAILLE1, entree);
        strcpy(tab->contacts[i].tel, ligne);

        i++
    }
    return 1;
}

当我编译我的代码时,没有任何问题,也没有任何警告。

但是当我运行我的代码时,一切都很好,直到我尝试在屏幕上打印一个名称,然后可执行文件崩溃。

我的主要功能如下所示:

int main(void)
{
    LISTE_TABLEAU *tabb;
    tabb->nb    = 0;

    lireDonneesTxt(&tabb);

    printf("%s", tabb->contacts[0].nom);

    return 0;
}

如果我在函数main末尾添加相同的 printf,lireDonneesTxt它会毫无问题地打印名称。我猜数据没有正确传递给结构。

我现在被阻止了,不知道该怎么做!

4

2 回答 2

3

不要在LISTE_TABLEAU这里传递指针的地址:

lireDonneesTxt(&tabb);

只需传递指针

lireDonneesTxt(tabb);

设置tabb->nb = 0;为未分配内存也是未定义的行为。

于 2013-06-07T12:28:43.407 回答
0

内存未分配给“tabb”,您正试图在 main() 函数中访问其成员变量 (tabb->nb)。这是非法的,因此运行时崩溃。

您可以尝试以下代码:

int main(void)
{
    LISTE_TABLEAU tabb;
    tabb.nb    = 0;

    lireDonneesTxt(&tabb);

    printf("%s", tabb.contacts[0].nom);

    return 0;
}
于 2013-06-07T12:42:35.710 回答