下記のような初期化した行列と列ベクトルをdatファイルに保存するプログラムを描いたのですが、実際にこのコードを実行しても機能してくれません。ですがなぜか

init(m * n, 1, A);

の前に

printf("%d", m);

と入れるとうまく機能します。これは何故なのでしょうか?上から2行が失敗例で最後が成功例です。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
void init(int n, float x, float * o) {
    for(int i = 0; i < n; i++) {
        o[i] = x;
    }
}

void print(int m, int n, const float * x) {
    for(int i = 0; i < m ; i++){
        for(int j = 0; j < n; j++){
            printf("%.4f ", x[j + i * n]);
        }
        printf("\n");
    }
}

void save(const char *filename, int m, int n, const float *A, const float*b){

    FILE *fp;
    if((fp = fopen(filename,"wb"))==NULL){
        printf("\aファイルをオープンできません。\n");
    } else {
        fwrite(A, sizeof(float), m * n, fp);
        fwrite(b, sizeof(float), n, fp);
        fclose(fp);
    }
}

int main(int argc, char *argv[]){
    int m = 0;
    int n = 0;
    float *A = malloc( sizeof(float) * (m*n));
    float *b = malloc( sizeof(float) * n);
    m = atoi(argv[1]);
    n = atoi(argv[2]);

    init(m * n, 1, A);
    init(n, 2, b);
    print(m, n, A);
    print(1, n, b);
    save("test.dat", m, n, A, b);
    return 0;
}