Поток 1: EXC_BAD_ACCESS (код = 1, адрес = 0x0) в C - PullRequest
0 голосов
/ 01 октября 2018

Я новичок в программировании на C .. Когда я строил proj, поток памяти возник в функции "matrixInit".ИДК, почему это происходит .. Я хочу решить эту проблему, поэтому вы можете сказать причину, по которой возник этот поток и как я могу ее решить?

(скомпилировано в Xcode)

main.c

#include <stdio.h>
#include "array2DvariableSize.h"
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    item a[] = {1,2,3,2,3,4,1,2,2};
    item b[] = {2,4,3,4,3,4,1,5,2};

    Matrix *m1 = matrixNew(3, 3);
    matrixInit(m1, a);
    matrixPrint(m1);

    Matrix *m2 = matrixNew(3, 3);
    matrixInit(m2, b);
    matrixPrint(m2);

    Matrix *m3;
    m3 = matrixAdd(m1, m2);
    matrixPrint(m3);

    matrixFree(m1);
    matrixFree(m2);
    matrixFree(m3);
    return 0;

}

array2DvariableSize.h

#ifndef array2DvariableSize_h
#define array2DvariableSize_h

#include <stdio.h>
typedef int item;
typedef struct {
    int col;
    int row;
    item** var;
}Matrix;

Matrix* matrixNew(int row, int col);
void matrixInit(Matrix* m, item* src);
void matrixFree(Matrix* m);
Matrix* matrixMultiply(const Matrix* a, const Matrix* b);
Matrix* matrixAdd(const Matrix* a,const Matrix* b);
void matrixPrint(Matrix* m);
#endif /* array2DvariableSize_h */

array2DvariableSize.c

#include "array2DvariableSize.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Matrix* matrixNew(int row, int col){
    Matrix* m;

    m = (Matrix*)malloc(sizeof(Matrix));
    m -> row = row;
    m -> col = col;
    m -> var = (item**)malloc(sizeof(item*)*row);
    for (int i = 0; i<row; i++){
         m->var[i] = (item*)malloc(sizeof(item)*col);
         memset(m->var[i], 0, sizeof(item)*col);
    }
}
    return m;
}

void matrixFree(Matrix* m){
    for (int i = 0 ; i < m -> row; i++){
        free(m->var[i]);
    }
    free(m->var);
    free(m);
}
void matrixInit(Matrix* m, item* src){
    for(int j = 0 ; j< m->row; j++){
        for(int i = 0; i < m->col; i++){
            m->var[j][i] = src[j*m->col + i]; // Thread occurred in herd

        }
    }
}

Matrix* matrixAdd(const Matrix* a, const Matrix* b){
    Matrix* m;
    if(a->col != b->col || a->row != b->row) return NULL;

    m = matrixNew(a->row, a->col);
    for(int j = 0; j < a->row; j++){
        for(int i = 0; i < a->col; i++){
            m->var[j][i] = a->var[j][i] + b->var[j][i];
        }
    }
    return m;
}

Matrix* matrixMultiply(const Matrix* a, const Matrix* b){
    Matrix* m;
    int col, row, iter;
    if(a->col != b->row) return NULL;
    row = a->row;
    col = b->col;
    iter = a->col;

    m = matrixNew(row, col);
    for (int j = 0; j<row; j++){
        for(int i= 0; i< col; i++){
            for(int k = 0; k < iter; k++){
                m->var[j][i] += a->var[j][k] * b->var[k][i];
            }
        }
    }
    return m;
}

void matrixPrint(Matrix* m){
    for(int j = 0; j < m->row; j++){
        for(int i = 0; i < m->col; i++){
            printf("%5d", m->var[j][i]);
        }
        printf("\n");
    }
    printf("\n");
}

Спасибо, что прочитали мой вопрос:)

1 Ответ

0 голосов
/ 02 октября 2018
void matrixInit(Matrix* m, item* src){
    for(int j = 0 ; j< m->row; j++){
        for(int i = 0; i < m->col; j++){
            m->var[j][i] = src[j*m->col + i]; // Thread occurred in herd

        }
    }
}

Причина, по которой возникла нить, была .. Я использовал 'j' вместо 'i' .... Lmao ..

...