Почему я забираю память? - PullRequest
0 голосов
/ 04 июня 2019

My first printf возвращает правильное значение, введенное пользователем, однако мой second printf начинает приносить мне мусор памяти .

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <omp.h>


typedef struct MATRIX {
    unsigned int row = 0, column = 0;
    int data[0][0];
};

void generateMatrixsParallel(struct MATRIX matrixA, struct MATRIX matrixB) {
    srand((unsigned int) time(NULL));

    printf("\n%d\n", matrixB.row);

    #pragma omp for
    for(int row = 0; row < matrixA.row; row++) {
        for(int column = 0; column < matrixA.column; column++) {
            matrixA.data[row][column] = rand();
        }
    }

    printf("\n%d\n", matrixB.row);

    #pragma omp for
    for(int row = 0; row < matrixB.row; row++) {
        for(int column = 0; column < matrixB.column; column++) {
            matrixB.data[row][column] = rand();
            //printf("MATRIX B[%d][%d]: [%d]\n", row, column, matrixB.data[row][column]);
        }
    }
}

int main() {
    static struct MATRIX matrixA;
    static struct MATRIX matrixB;

    printf("BETWEEN WITH QUANTITY OF  LINES [VECTOR A]: ");
    scanf("%d", &matrixA.row);

    printf("BETWEEN WITH QUANTITY OF  COLUMN [VECTOR A]: ");
    scanf("%d", &matrixA.column);

    printf("BETWEEN WITH QUANTITY OF  LINES [VECTOR B]: ");
    scanf("%d", &matrixB.row);

    printf("BETWEEN WITH QUANTITY OF  COLUMN [VECTOR B]: ");
    scanf("%d", &matrixB.column);

    #pragma omp parallel firstprivate(matrixA, matrixB) num_threads(3)
    {
        #pragma omp master
        printf("AGUARDE... A THREAD MASTER ESTÁ GERANDO AS MATRIZES!", omp_get_thread_num());
        generateMatrixsParallel(matrixA, matrixB);
    }


    return 0;
}

1 Ответ

0 голосов
/ 04 июня 2019

Во-первых, вы намеренно передавали эти матрицы по значению, а не по ссылке?Это нормально, но странно.

Во-вторых, вы установили размер матрицы равным 0,0;поэтому строка:

matrixA.data[row][column] = rand();

Недопустима - 0 строк по 0 столбцов - это 0 элементов для хранения вещей. Если вы хотите сделать это динамически, вы должны сделать это на самом деле, иначе вы просто строчитепо памяти.memcpy((void*)rand(), (void*)rand(), rand()) - гораздо более быстрый способ создать странность.

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