Ошибка сегментации для radix рода C - PullRequest
0 голосов
/ 08 октября 2018

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

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
// #include <omp.h>

#include "sort.h"
#include "edgelist.h"


void radixSortEdgesBySource(struct Edge *edges_sorted, struct Edge *edges, int numVertices, int numEdges) {


    int i,j;
    int *vertex_cnt = (int *) malloc (256 * sizeof(int)); 

    for (j = 0; j < 4; ++j)  //Radix Sort for d digits
    {
    //int *vertex_cnt = (int *) malloc ((1<<8) * sizeof(int));

        for(i = 0; i < 256; ++i) 
        {
            vertex_cnt[i] = 0;
        }     

        for(i = 0; i < numEdges; ++i) 
        {       
            vertex_cnt[(edges[i].src >> 8*j) & ((1 << 8) - 1)]++;
        }


        for(i = 1; i < 257; ++i)
        {
            vertex_cnt[i] += vertex_cnt[i - 1];    
        }

        for(i = numEdges - 1; i >= 0; --i) {  
        //printf("KEY: %d\n", (edges[i].src >> 8*j) & ((1 << 8) - 1));      
            edges_sorted[--vertex_cnt[(edges[i].src >> 8*j) & ((1 << 8) - 1)]] = edges[i];
        }
        edges = edges_sorted;        
    //free(vertex_cnt);
    }
   // free(vertex_cnt);

 }

Значения edges и edges_sorted определены как:

  struct Edge{
    int src;      // id of a source vertex
    int dest;     // id of a destination vertex
};

struct Edge * newEdgeArray(int numOfEdges);

Может кто-нибудь помочь мне с объяснением ошибки сегментации?

1 Ответ

0 голосов
/ 08 октября 2018

Вы выделяете память для 256 элементов:

int *vertex_cnt = (int *) malloc (256 * sizeof(int)); 

, но затем выполняете итерацию массива, как если бы он содержал 257 элементов:

    for(i = 1; i < 257; ++i)

Я настоятельно рекомендую научиться использовать Valgrind.Вы сможете поймать точную строку, где происходит ошибка доступа к памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...