簡體   English   中英

為2D數組分配內存時出現分段錯誤

[英]Segmentation fault when allocating memory for a 2D array

該程序從命令行獲取參數,並使用線程顯示其主要因素。 我正在使用一種結構在線程之間傳遞信息。 該結構具有一個2D數組,其中包含參數以及它們的因子。 現在,我分配的方式使我可以訪問兩個參數,這給了我一個Segmentation錯誤(Segmentation錯誤的位置在代碼中指出)。 我究竟做錯了什么? 下面提供了所有代碼。

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>

// Global variables
#define MAX_FACTORS (11)
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

struct Buffer {
    int **factors;
    int size;
};


void *factor ( void *buffer );
void *displayFactors (void *factors);


// MAIN
int main (int argc, char* argv[]) {
    // Create Buffer
    struct Buffer *buffer;
    buffer = malloc(sizeof(struct Buffer));
    buffer->size = argc - 1;

    // Allocate memory for factors 2d array
    buffer->factors = malloc(buffer->size);

    for( int i = 0; i < buffer->size; i++) {
        buffer->factors[i] = calloc(MAX_FACTORS, sizeof(int));
    }

    pthread_mutex_lock(&mutex1);

    if(buffer->size > 0) {
        for(int i = 1; i < argc; i++){
            buffer->factors[i - 1][0] = atoi(argv[i]);
            // ---SEGMENTATION FAULT OCCURS HERE AFTER LOOPING TWICE.----
        }
    }
    else
        return 0;

    pthread_mutex_unlock(&mutex1);

    pthread_t producer;
    pthread_t consumer;

    pthread_create(&producer, NULL, factor, (void*)buffer);
    pthread_create(&consumer, NULL, displayFactors, (void*)buffer);

    pthread_join(producer, NULL);
    pthread_join(consumer, NULL);

    free(buffer->factors);

    return 0;
}


// PRODUCER
void *factor ( void *buffer ) {
    struct Buffer *prod_buffer = (struct Buffer*)buffer;

    pthread_mutex_lock(&mutex1);

    // find numbers to factor factors
    int i = 0;
    while(i < prod_buffer->size) {
        // printf("Numbers to factor: %d\n", prod_buffer->factors[i][0]);
        prod_buffer->factors[i][0] = prod_buffer->factors[i][0];
        i++;
    }

    // Factor numbers
    for(int i = 0; i < prod_buffer->size; i++) {
        int j = 1;
        int toFactor = prod_buffer->factors[i][0];
        while(toFactor % 2 == 0) {
            prod_buffer->factors[i][j] = 2;
            toFactor = toFactor / 2;
            j++;
        }
        for(int k = 3; k <= toFactor; k += 2) {
            while (toFactor % k == 0) {
                prod_buffer->factors[i][j] = k;
                toFactor /= k;
                j++;
            }
        }
    }
    pthread_mutex_unlock(&mutex1);
    return NULL;
}


// CONSUMER
void *displayFactors (void *buffer) {
    struct Buffer *cons_buffer = (struct Buffer*)buffer;

    for (int i = 0; i < cons_buffer->size; i++) {
        printf("%d: ", cons_buffer->factors[i][0]);
        for (int j = 1; j < MAX_FACTORS; j++){
            if(cons_buffer->factors[i][j] != 0) printf("%d ", cons_buffer->factors[i][j]);
        }
        printf("\n");
    }
    return NULL;

}

編輯-我正在測試的參數是4,13,46,72,5和12。結果應顯示為:4:2 2 13:13 46:2 23 72:2 2 2 3 3 5: 5 12:2 2 3

謝謝您的幫助!

我使用gdb調試您的代碼,發現buffer->factors的大小為8,這還不夠。

你應該做

buffer->factors = malloc(buffer->size*sizeof(int *));

segmentation fault錯誤可以修復。

另外,您的代碼中還有另一個錯誤。 如果consumer首先執行,則輸出將為空,因此您需要使用cond首先使producer執行。

這里有一些提示:

pthread_cond_t product = PTHREAD_COND_INITIALIZER; /*global*/ 
pthread_cond_signal(&product);  /*In factor function*/

另外displayFactors需要添加一個互斥量

/*in displayFactors function*/
pthread_cond_wait(&product, &mutex1); 

在哪里放置這些語句,您應該自己弄清楚。 希望能對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM