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

时间:2014-04-18 13:10:07

标签: c

所以我有以下问题:

我有struct ListAut

struct ListAut{
    char* biggestn;
    int sizeof_biggestn;
    int total_len;
    struct node* avl;
};

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);
}

这是项目所需模块的重要组成部分,主要是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);

    }
}

当我在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);

那些印刷品让我看到了seg错误的原因在哪里,但最后一行印刷的是“创建索引”。

1 个答案:

答案 0 :(得分:6)

有几种情况undefined behavior和一次内存泄漏(以及可能出现未定义行为的情况):

  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. 如果返回指向局部变量或数组的指针,上述调用也可能导致未定义的行为。

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


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