У меня есть структура:
typedef struct{
int *issueTypeCount;
}issueTypeTracker;
Я объявила переменную типа issueTypeTracker
:
issueTypeTracker *typeTracker;
Я выделил необходимую память:
typeTracker = (issueTypeTracker*) malloc(sizeof(issueTypeTracker) * issueTypeList.count());
typeTracker->issueTypeCount = (int*) calloc(65536,sizeof(int));
И затем, когда я пытаюсь что-то с этим сделать, у меня возникает ошибка сегментации
while(qry.next()){ //while there are records in the query
for(j=0;j<locationList.count();j++){ // no problem
if(qry.value(1) == locationList[j]){ //no problem
for(i=0;i<issueTypeList.count();i++){ //no problem
typeTracker[j].issueTypeCount[i]++; //seg fault as soon as we hit this line
}
}
}
}
Я понял, что это будет проблема с тем, как я выделил память, но насколько мне известно, я сделал это правильно. Я пробовал решения, предложенные в этом вопросе, однако это все еще не сработало.
Я попытался заменить typeTracker->issueTypeCount = (int*) calloc(65536,sizeof(int));
с:
for(j=0;j<issueTypeList.count();j++){
typeTracker[j].issueTypeCount = (int*) calloc(65536,sizeof(int));
}
Но я все еще получаю ту же проблему. Это происходит с любым значением j
или i
, равным нулю.
Это намного больше проблем, чем стоит, и плохая реализация того, что я пытаюсь сделать в любом случае, поэтому я, вероятно, собираюсь отказаться от всего этого и просто использовать многомерный массив. Тем не менее, я хотел бы знать, почему это не работает, поэтому в будущем у меня не будет проблем, когда я столкнусь с похожим сценарием.
У вас есть несколько вопросов. Во-первых, вы не проверяете свои ассигнования на успех, поэтому любой из ваших указателей может быть NULL/nullptr.
Во-вторых,
typeTracker->issueTypeCount = (int*) calloc(65536,sizeof(int));
эквивалентно
typeTracker[0].issueTypeCount = (int*) calloc(65536,sizeof(int));
поэтому вы инициализировали член issueTypeCount только для первого типа issueTypeTracker в своем массиве. Для другого issueTypeList.count() - 1
элемента в массиве указатель не инициализирован.
Поэтому эта строка:
typeTracker[j].issueTypeCount[i]++; //seg fault as soon as we hit this line
будет вызывать UB для любого j>0
. Очевидно, если ваше распределение не удалось, у вас есть UB для j==0
.
for
, но я все еще получаю ошибку сегментации для любого значения i
или j
.
i
и j
? Если вы все еще не видите, как вы дошли до этого момента, запустите команду valgrind и посмотрите, не повредит ли что-то еще вашему массиву.
typeTracker
является адресом памяти (отличается от того, с которого он начинается, поэтому я знаю, что malloc работал), а значениеtypeTracker.issueTypeCount
равно нулю.