2015-09-27 93 views
0

我学习C.我有如下所示方案动态矩阵分配

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

void main(){ 

int i, j, k, m, n; 
double **x; 
double **y; 
printf("Enter a number as the size of two square matrices\n"); 
scanf("%d", &m); 
x = (double**)malloc(m * sizeof(double)); 
y = (double**)malloc(m * sizeof(double)); 
/* initialize random seed: */ 
srand(time(NULL)); 
for(i = 0; i < m; i++) { 
    x[i] = (double*)malloc(m * sizeof(double)); 
    y[i] = (double*)malloc(m * sizeof(double)); 
    for(i = 0; i < m; i++) { 
     for(j = 0; j < m; j++) { 
      x[i][j] = rand(); 
      y[i][j] = rand(); 
     } 
     printf("\n"); 
    } 
    } 
    printf("\n\n"); 
} 

当运行此程序,动态创建并填充两个矩阵X和Y,在使用RAND()随机数的程序并给出2作为我的矩阵大小,我看到“Segmetation Fault”错误。请注意,这个想法是用double类型的随机元素填充这两个矩阵。让我知道如果上面的代码是正确的。

更正:EDIT1

x = (double**)malloc(m * sizeof(double*)); 
y = (double**)malloc(m * sizeof(double*)); 
/* initialize random seed: */ 
srand(time(NULL)); 
for(i = 0; i < m; i++) { 
    x[i] = (double*)malloc(m * sizeof(double)); 
    y[i] = (double*)malloc(m * sizeof(double)); 

    for(j = 0; j < m; j++) { 
     x[i][j] = rand(); 
     y[i][j] = rand(); 
    } 
    printf("\n"); 

    } 
    printf("\n\n"); 
} 

以上,现在正常工作。需要关于 的一些解释x =(double **)malloc(m * sizeof(double *)); 和 x [i] =(double *)malloc(m * sizeof(double)); (double *)malloc(m * sizeof(double *)); sizeof(double *)in x =(double **)

EDIT2

void main(){ 

int i, j, k, m, n; 
printf("Enter a number as the size of two square matrices\n"); 
scanf("%d", &m); 

double (*x)[m] = malloc(sizeof(double[m][m])); 
double (*y)[m] = malloc(sizeof(double[m][m])); 
/* initialize random seed: */ 
srand(time(NULL)); 
for(i = 0; i < m; i++) { 
    for(j = 0; j < m; j++) { 
     x[i][j] = rand(); 
     y[i][j] = rand(); 
    } 
    printf("\n"); 

    } 
    printf("\n\n"); 
} 

作为每改变延Gustedt矩阵分配...我已删除

double **x; 
double **y; 
x = (double**)malloc(m * sizeof(double*)); 
y = (double**)malloc(m * sizeof(double*)); 
x[i] = (double*)malloc(m * sizeof(double)); 
y[i] = (double*)malloc(m * sizeof(double)); 
+0

不,这是不正确的。获得seg故障清楚地告诉您存在问题。建议您在调试器中运行程序和/或添加调试打印语句以尝试查找您的问题。你也可以看看这个问题中的“相关”链接。这种矩阵分配已经有很多次了。 – kaylum

+0

user3121023感谢您指出。我添加了*并删除了内部循环。 –

+0

@ user3121023你能解释一下行吗 x =(double **)malloc(m * sizeof(double));和x [i] =(double *)malloc(m * sizeof(double)); –

回答

0

这些仅仅是假的矩阵和该技术属于成一个博物馆。在现代C中,自C99以来,只需将一个2D矩阵分配为double (*matrix)[m] = malloc(sizeof(double[m][m]));即可。因此,您只需要对整个矩阵调用malloc,并将其全部存储在连续内存中。
- Jens Gustedt