I have the following struct
struct matrix_t {
int m;
int n;
double * data;
} matrix_t;
Which gets initialized and returned in a method.
struct matrix_t * makematrix(char * NAME){
...
static struct matrix_t data;
data.m = m;
data.n = n;
data.data = &matrix[0][0];
return &data;
}
I call this method from main
int main() {
...
struct matrix_t * makematrix(...);
printf("%lf\n", matrix1->data[4]);
printmatrix(matrix1); // this is discussed right below
The correct element is printed out with printf. I then try to pass it to another call
printmatrix(matrix1);
which tries to do the exact same print statement
void printmatrix(struct matrix_t * matrix){
printf("data point %lf\n", (matrix->data[4]));
But here it prints a 0.000 which is wrong. Is my data array getting deallocated? I've been banging my head. Whats going on.
Reproducing example
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include<iostream>
struct matrix_t {
int m;
int n;
double * data;
} matrix_t;
//void printmatrix(int m, int n, double *matrix){
void printmatrix(struct matrix_t * matrix){
printf("MATRIX: \n");
printf("M %d \n", matrix->m);
printf("N %d \n", matrix->n);
printf("data point %lf\n", (matrix->data[4]));
for (int i = 0; i < matrix->m; i++){
for (int j = 0; j < matrix->n; j++){
//printf("%d\t", i* matrix->n + j);
//printf("%lf\t", matrix->data[i* matrix->n + j]);
}
printf("\n");
}
}
struct matrix_t * readfile(char * NAME){
// Function for reading input files and returning data.
FILE *fptr;
char * line = NULL;
size_t len = 0;
ssize_t read;
int linenum = 0;
//array size
int m;
int n;
if ((fptr = fopen(NAME,"r")) == NULL){
printf("Error! opening file");
exit(1);
}
while ((read = getline(&line, &len, fptr)) != -1) {
if (linenum==0){
sscanf(&line[0], "%d %d", &m, &n);
}
linenum++;
}
//allocate mxn matrix
double matrix[m][n];
fclose(fptr);
fptr = fopen(NAME,"r");
linenum=0;
fscanf(fptr, "%d %d", &m,&n);
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
fscanf(fptr, "%lf", &matrix[i][j]);
}
}
static struct matrix_t data;
data.m = m;
data.n = n;
data.data = &matrix[0][0];
printf("testing \n");
printf("%lf\n", data.data[4]);
return &data;
}
int main()
{
char filename1[] = "Amat.dat";
char filename2[] = "Bmat.dat";
struct matrix_t * matrix1;
//struct matrix_t * matrix2;
matrix1 = readfile(&filename1[0]);
printf("%lf\n", matrix1->data[4]);
printmatrix(matrix1);
//matrix2 = readfile(&filename2[0]);
//printmatrix(matrix1);
//printf("test %lf", matrix1[0][0]);
return 0;
}
prints:
testing
4.000000
4.000000
MATRIX:
M 4
N 4
data point 0.000000
where a file might look like
2 2
1 2
3 4