分段故障(核心转储) - 结构;

Ped*_*677 0 c

所以我有以下问题:

我有这个 struct ListAut

struct ListAut{
    char* biggestn;
    int sizeof_biggestn;
    int total_len;
    struct node* avl;
};
Run Code Online (Sandbox Code Playgroud)

它typedef是因为它如下:

typedef struct ListAut *IndexOfAuts;

IndexOfAuts *newIndexOfAuts()
{
    int i;
    IndexOfAuts *ioa = malloc(27 * sizeof(struct ListAut));

    for (i = 0; i < 27; i++)
    {
        ioa[i]->biggestn = "";
        ioa[i]->sizeof_biggestn = 0;
        ioa[i]->total_len = 0;
        ioa[i]->avl = NULL;
    }
    return ioa;
}

void insertName(IndexOfAuts * ioa, char *nome)
{
    char *aux = malloc(sizeof(nome));

    aux = trim(nome);
    int index = getIndexOfLetter(aux);

    if (nameLen(aux) > getSizeOfLongName(ioa[index]))
    {
        strcpy(ioa[index]->biggestn, aux);
        ioa[index]->sizeof_biggestn = nameLen(aux);
    }
    ioa[index]->total_len += nameLen(aux);
    insert(ioa[index]->avl, aux);
}
Run Code Online (Sandbox Code Playgroud)

这是项目所需模块的重要组成部分,主要是Seg Faulting.我怀疑它是在创建一个"对象" newIndexOfAuts(),这个模块的想法是有一个27个指向这些结构的数组,一个到每个字母,另一个到特殊字符; 现在我只是感到困惑,因为它可能来自上面的问题或者来自我制作的模块加载器:

void loadModules(char *filename, IndexOfAuts * ioa, StatTable st)
{
    char *nameofile = malloc(20);

    strcpy(nameofile, filename);
    FILE *file = fopen(nameofile, "r");

    if (file != NULL)
    {
        int counter, ano;
        char *buff, *field, *auxil;

        buff = malloc(1024);
        field = malloc(200);
        auxil = malloc(200);
        while (fgets(buff, 1024, file))
        {
            counter = 0;
            field = strtok(buff, ",");
            printf("inserting 1st name\n");
            insertName(ioa, field);
            counter++;
            while (!atoi(field))
            {

                if ((auxil = strtok(NULL, ",")) != NULL)
                {
                    counter++;
                    field = auxil;
                    insertName(ioa, field);

                }
            }
            ano = atoi(field);
            incPub(st, ano, counter - 1);
        }
        fclose(file);

    }
}
Run Code Online (Sandbox Code Playgroud)

当我在main中运行它时,它具有以下行:

printf("Creating Stat Table");
StatTable st=newStatTable();\\This Line is correct, i checked it,i hope
printf("Creating index");
IndexOfAuts* ioa=newIndexOfAuts();
printf("Loading Modules");
loadModules(filename,ioa,st);
Run Code Online (Sandbox Code Playgroud)

那些印刷品让我看看seg故障的原因在哪里,但最后一行是"创建索引".

Som*_*ude 6

有几种未定义的行为和一次内存泄漏(以及可能的未定义行为):

  1. 你有这个初始化ioa[i]->biggestn="";它使biggestn成员指向一个字符('\0'字符)的常量数组.然后你strcpy(ioa[index]->biggestn,aux);会写一个常量字符,然后在数组之外写入未知内存.

  2. 你有这个:char* aux=malloc(sizeof(nome));它只分配4或8个字节,这是指针的大小而不是指针所指向的.使用strlen得到一个字符串的长度.

  3. 对于上面的分配,您还需要分配一个额外的字节,因为strlen只返回没有终结符的字符串的长度.

  4. 你有aux=trim(nome);这个覆盖你刚刚分配的指针,导致内存泄漏.

  5. 如果返回指向局部变量或数组的指针,上面的调用也可能导致未定义的行为.

可能还有其他有问题的线条,这些只是我在快速浏览时发现的线条.


一般提示:学习使用调试器!调试器是编译器旁边的程序员最佳工具.如果在调试器中运行程序,调试器将在崩溃位置停止,让您检查(并且也向上)函数调用堆栈,并让您检查变量的值.