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