所以我有以下问题:
我有这个 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故障的原因在哪里,但最后一行是"创建索引".
有几种未定义的行为和一次内存泄漏(以及可能的未定义行为):
你有这个初始化ioa[i]->biggestn="";它使biggestn成员指向一个字符('\0'字符)的常量数组.然后你strcpy(ioa[index]->biggestn,aux);会写一个常量字符,然后在数组之外写入未知内存.
你有这个:char* aux=malloc(sizeof(nome));它只分配4或8个字节,这是指针的大小而不是指针所指向的.使用strlen得到一个字符串的长度.
对于上面的分配,您还需要分配一个额外的字节,因为strlen只返回没有终结符的字符串的长度.
你有aux=trim(nome);这个覆盖你刚刚分配的指针,导致内存泄漏.
如果返回指向局部变量或数组的指针,上面的调用也可能导致未定义的行为.
可能还有其他有问题的线条,这些只是我在快速浏览时发现的线条.
一般提示:学习使用调试器!调试器是编译器旁边的程序员最佳工具.如果在调试器中运行程序,调试器将在崩溃位置停止,让您检查(并且也向上)函数调用堆栈,并让您检查变量的值.