基数C的分段错误

时间:2018-10-08 16:47:05

标签: c sorting

我正在尝试通过将数字分成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);

 }

edgesedges_sorted定义为:

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

struct Edge * newEdgeArray(int numOfEdges);

有人可以帮我解决为什么出现细分错误吗?

1 个答案:

答案 0 :(得分:1)

您为256个元素分配内存:

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

,但是然后迭代数组,就好像它有257个元素一样:

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

我强烈建议学习使用Valgrind。您将能够找到发生内存访问错误的确切行。