首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分段断层(岩心倾弃)-结构;

分段断层(岩心倾弃)-结构;
EN

Stack Overflow用户
提问于 2014-04-18 13:10:06
回答 1查看 246关注 0票数 0

因此,我有以下问题:

我有这个struct ListAut

代码语言:javascript
复制
struct ListAut{
    char* biggestn;
    int sizeof_biggestn;
    int total_len;
    struct node* avl;
};

typedef如下:

代码语言:javascript
复制
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故障。我怀疑这是在创建一个"object“newIndexOfAuts(),这个模块的思想是拥有一个指向这些结构的27个指针的数组,每个指针指向每个字母,另一个指针指向特殊字符;现在我感到困惑,因为这可能是因为上面的问题或者是我制作的模块加载程序的问题:

代码语言:javascript
复制
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中运行它时,它有以下几行:

代码语言:javascript
复制
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故障的原因,但最后一行打印的是“创建索引”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-18 13:18:52

有几种http://en.wikipedia.org/wiki/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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23154867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档