打印数组元素时出现分段错误(核心转储)(使用 pthreads)

Getting a segmentation fault (core dumped) when printing elements of an array (Using pthreads)

所以我正在尝试使用线程(使用 pthread)进行桶排序。该程序尝试对从 0 到 999 的 3500 个整数进行排序并将它们划分为范围(此范围取决于线程数)因此如果有 4 个线程,一个线程将从 0 到 250 对数字进行排序,另一个线程将从 251 排序到 500 等等。

我试图创建一个函数,returns 是一个仅包含每个线程范围内的数字的数组。这是我在 pthread_create 中作为参数发送的函数。这是该函数和全局变量的代码:

int arreglo[3500];  //Array of 3500 random numbers
int elementosEnArregloTmp;  //Number of elements in each range
int num_Hilos;          //Number of threads
int elementos_Arreglo = 3500;   //3500
int tamanoRango;     //Size of range. 1000 / #OfThreads

    int *llenarElementosArreglo(int A[], int n){        
        int i,k=0;
        int *B = malloc(sizeof(int)*A[n]);
    for(i = 0; i < 3500; i++){
        if(n < num_Hilos-1){
            if(arreglo[i] >= tamanoRango*n && arreglo[i] < tamanoRango*(n+1)){
                B[k]=arreglo[i];
                k++;
            }
        }
        else if(arreglo[i] >= tamanoRango*n && arreglo[i] < 1000){
                B[k]=arreglo[i];
                k++;
            }
    }

    mostrarArreglo(B,A[n]); //Funcion que imprime el arreglo
    elementosEnArregloTmp = A[n];
    
    return B;
}

使用此函数,我尝试创建一个动态数组,其元素大小为 3500 个整数的主数组在每个特定范围内的元素大小(这就是数组 A[] 的用途)和 'n'是函数将要return 元素在范围内的数组的线程。

当我 运行 只有 1、2 或 3 个线程的程序时我没有问题,它 运行 完美,但是当我放置 4 个或更多线程时,我最终得到一个分段故障(核心转储)。我还注意到分段错误不会在填充动态数组时发生,而是在最后调用打印数组元素的函数 (mostrarArreglo) 时发生。

几个小时以来,我一直在尝试更改某些内容,但一直无法解决这个问题。

我也打算放一部分主要代码,虽然我不认为问题出在主要代码中。

int main (int argc, char* argv[]){  
    ...
    ...
    pthread_t hilos[num_Hilos];     //Se declara que habran 5 hilos

    for(i = 0; i < num_Hilos; i++){ //Ciclo para crear los 5 hilos con su funcion que sera bucketSortPorHilo
            error = pthread_create(&hilos[i], NULL, bucketSortPorHilo, (void*)(llenarElementosArreglo(elementosPorRango,i)));     
            if(error){          
                    fprintf(stderr,"Error %d: %s\n", error, strerror (error));
                    exit (-1);
            }
            error = pthread_join(hilos[i], NULL);
            if(error) error_fatal(error, "pthread_join");
        }  
    return 0;   
}

所以我不知道自己的回答是否错误 post,但我解决这个问题的方法是返回一个结构,该结构包含数组(每个数字范围)和一个 int数组的元素数!!