Ошибка сегментации со структурным массивом с использованием calloc

0

У меня есть структура:

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, равным нулю.

Это намного больше проблем, чем стоит, и плохая реализация того, что я пытаюсь сделать в любом случае, поэтому я, вероятно, собираюсь отказаться от всего этого и просто использовать многомерный массив. Тем не менее, я хотел бы знать, почему это не работает, поэтому в будущем у меня не будет проблем, когда я столкнусь с похожим сценарием.

  • 1
    Проверьте возвращаемое значение malloc / calloc.
  • 0
    @bitmask Я снова запустил его через отладчик - как и ожидалось, значение typeTracker является адресом памяти (отличается от того, с которого он начинается, поэтому я знаю, что malloc работал), а значение typeTracker.issueTypeCount равно нулю.
Показать ещё 12 комментариев
Теги:
struct
segmentation-fault

1 ответ

1

У вас есть несколько вопросов. Во-первых, вы не проверяете свои ассигнования на успех, поэтому любой из ваших указателей может быть 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.

  • 0
    Что касается первой проблемы, я вполне уверен, что распределение прошло успешно, потому что я получаю адреса памяти там, где я ожидаю их, и нулевые значения там, где я ожидаю их (фактические данные, содержащиеся в массиве). В любом случае, вы правы, и это легко исправить. Что касается второй проблемы, я тоже это понял, и поэтому я использовал подход цикла for , но я все еще получаю ошибку сегментации для любого значения i или j .
  • 0
    Не будьте уверены , просто закодируйте его правильно, чтобы он не ошибался. Проверьте возвращаемое значение и выручите, если выделение не удастся. Когда процесс стал ядром, по какому адресу он пытался отменить ссылку? Каковы были значения i и j ? Если вы все еще не видите, как вы дошли до этого момента, запустите команду valgrind и посмотрите, не повредит ли что-то еще вашему массиву.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню