我的代碼給glibc錯誤。請別人指出我的錯誤。 此代碼用於標記單詞。我如何使用GDB或任何其他可能有用的工具解決這些問題。下面glibc檢測到outfile:free():無效指針:
#include <stdio.h>
#include <stdlib.h>
#include <glib.h>
#include <string.h>
struct token
{
char *token;
int length;
};
void freeing(gpointer item)
{
free(((struct token*)item)->token);
}
int main(int argc, char* argv[])
{
int start1 = 0, start2 = 0, i =0;
struct token *tk = NULL;
char line[256], *temp = NULL;
FILE *fp1 = NULL;
FILE *fp2 = NULL;
GSList *list = NULL, *iterator = NULL;
fp1 = fopen(argv[1], "r");
fp2 = fopen(argv[2], "w+");
if (NULL == fp1)
{
fprintf(stderr,"cant open %s",argv[1]);
return 1;
}
if (NULL == fp2)
{
fprintf(stderr,"cant open %s",argv[2]);
return 1;
}
while (1)
{
if (NULL == fgets(line, 255, fp1))
break;
tk = (struct token *)malloc(sizeof(struct token));
start1 = -1; start2 = -1;
for(temp = line,i = 0; temp[i] != '\n'; i++)
{
if ((temp[i] == ',') || (temp[i] == ' ') || (temp[i] == ';') || (temp[i] == '.'))
start2 = i;
if (start1 == start2)
continue;
tk->token = strndup(line + (start1+1), start2 - (start1+1));
tk->length = strlen(tk->token);
list = g_slist_append(list, tk);
start1 = start2;
}
tk->token = strndup(line + (start1+1), strlen(line));
tk->length = strlen(tk->token);
printf("\ntk->length : %d\n",tk->length);
list = g_slist_append(list, tk);
}
for (iterator = list; iterator; iterator = iterator->next)
{
printf("%s -> ",((struct token *)(iterator->data))->token);
printf("%d\n",((struct token*)iterator->data)->length);
}
g_slist_foreach(list, (GFunc)freeing, NULL);
fclose(fp1);
fclose(fp2);
return 0;
}
請格式化您的代碼,刪除不必要的強制轉換並將其一致地縮進。 –
'list = g_slist_append(list,tk);'在'for'循環中被重複調用,具有相同的'tk'值。也就是說,您正在多次排隊相同的元素。因此多次釋放相同的標記。所以第一次免費會成功,隨後的免費會導致您顯示的錯誤。請注意,代碼中存在其他錯誤,例如內存泄漏和內存損壞。內存問題的一個好的調試工具是[valgrind](http://valgrind.org/) – kaylum
我爲每個已讀取的新令牌分配新的空間並將其存儲在列表中。這不正確嗎? – Tejas