因此,我有以下问题:
我有这个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故障。我怀疑这是在创建一个"object“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故障的原因,但最后一行打印的是“创建索引”。
发布于 2014-04-18 13:18:52
有几种http://en.wikipedia.org/wiki/Undefined_behavior和一次内存泄漏的情况(还有可能出现未定义行为的情况):
ioa[i]->biggestn="";使biggestn成员指向一个由一个字符组成的常量数组( '\0'字符)。然后执行strcpy(ioa[index]->biggestn,aux);,它将对一个常量字符进行写入,然后在数组外写入未知内存。char* aux=malloc(sizeof(nome));只分配4或8个字节,这是指针的大小,而不是指针指向的。使用strlen获取字符串的长度。strlen只返回字符串的长度,而没有终止符。aux=trim(nome);覆盖了刚才分配的指针,导致内存泄漏。可能还有其他一些有问题的行,这些都是我一眼就发现的。
还有一个小提示:学会使用调试器!调试器是程序员的最佳工具,仅次于编译器。如果您在调试器中运行您的程序,调试器将停止在崩溃的位置,并让您检查(也走上)函数调用堆栈,以及让您检查变量的值。
https://stackoverflow.com/questions/23154867
复制相似问题