Я работаю над программой на языке C, которая имеет связанный список. Мне нужно удалить последний элемент из связанного списка, и он работает главным образом, кроме случаев, когда он попадает в определенную часть моего кода, тогда он имеет ошибку сегментации.Удалить последний элемент из связанного списка
Код, который у меня есть выглядит следующим образом:
int clearOutboundLegFromList(callLogSearchOutboundStruct ** outboundLeg, int dataCol, int rowTargets)
{
//callLogSearchOutboundStruct *currentStruct = *outboundLeg;
//callLogSearchOutboundStruct *temp;
if (*outboundLeg == NULL)
{
return 0;
}
SL_DebugAll(DBG_ALWAYS, "DEBUG: Clearing outbound legs: DataCol: %i RowTargets: %i",
dataCol, rowTargets);
callLogSearchOutboundStruct *legToRemove = NULL;
callLogSearchOutboundStruct *last = NULL;
legToRemove = *outboundLeg;
while (legToRemove->nextLeg != NULL)
{
last = legToRemove;
legToRemove = legToRemove->nextLeg;
}
if (legToRemove->target != NULL)
{
free(legToRemove->target);
legToRemove->target = NULL;
}
if (legToRemove->cleardownCause)
{
free(legToRemove->cleardownCause);
legToRemove->cleardownCause = NULL;
}
free(legToRemove);
if (last != NULL)
{
last->nextLeg = NULL;
}
legToRemove = NULL;
}
Он падает на линии free(legToRemove->target);
.
В дамп я следующее:
Program terminated with signal 11, Segmentation fault.
#0 0x00b01336 in _int_free() from /lib/libc.so.6
Missing separate debuginfos, use: debuginfo-install cyrus-sasl-lib-2.1.23-13.el6_3.1.i686 glibc-2.12-1.132.el6_5.2.i686 keyutils-libs-1.4-4.el6.i686 krb5-libs-1.10.3-15.el6_5.1.i686 libcom_err-1.41.12-18.el6.i686 libcurl-7.19.7-37.el6_5.3.i686 libidn-1.18-2.el6.i686 libselinux-2.0.94-5.3.el6_4.1.i686 libssh2-1.4.2-1.el6.i686 mysql-libs-5.1.73-3.el6_5.i686 nspr-4.9.2-1.el6.i686 nss-3.14.0.0-12.el6.i686 nss-softokn-freebl-3.12.9-11.el6.i686 nss-util-3.14.0.0-2.el6.i686 openldap-2.4.23-31.el6.i686 openssl-1.0.1e-16.el6_5.14.i686 zlib-1.2.3-29.el6.i686
(gdb) bt
#0 0x00b01336 in _int_free() from /lib/libc.so.6
#1 0x0805cd0b in clearOutboundLegFromList (outboundLeg=0xb5de7984, dataCol=9, rowTargets=11) at performreport.c:6731
#2 0x08058f33 in processDrilldownData (reportParameterArray=..., csvFile=0x8e3fc78, HandleDB=0xbfca7a14, resultReport=0x8e457a8,
Если я печатаю из дампа ядра legToRemove-> цель GDB выводит следующее:
$1 = 0x99235d8 ""
Теперь, похоже, его правильно выделенное пространство памяти, оно просто содержит пустую строку, поэтому я не понимаю, почему это вызовет segfault.
Спасибо за любую помощь, которую вы можете предоставить.
Вы не даете достаточно информации, чтобы найти настоящую причину. Но вот две возможные причины: поле 'target' должно быть выделено' malloc', если вы хотите «освободить» его. Либо вы этого не сделали (потому что 'target' - это массив символов в структуре, например' target [20] ', или потому, что это просто указатель на какую-либо другую память) или вы изменили значение' target' после его выделения. –
Я не уверен, что если (legToRemove-> cleardownCause), почему бы не if (NULL! = LegToRemove-> cleardownCause) – flotto
В чем смысл аргументов функции ', int dataCol, int rowTargets)'. Они, кажется, не используются. Предназначены ли они для определения элемента, который нужно удалить? – joop