我正在尝试从用户输入中读取矩阵维度(dim
)并动态创建n*n
矩阵。
但是当我打印矩阵时,我的程序崩溃了。
我在Stackoverflow中搜索,可能是free()
错误。
我不知道为什么,但程序在dim < 5
时有用。
#include <stdio.h>
#include <stdlib.h>
typedef struct{
float real, img;
}COMPLEXO;
void zeroIt(COMPLEXO **matrix, int dim){
int i,j;
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
matrix[i][j].real=0;
matrix[i][j].img=0;
}
}
}
int main(void){
int dim, i, j;
COMPLEXO **matrix;
int flag = 1;
/*Pedir Dimensao da Matrix*/
printf("DIM: \n");
scanf("%d", &dim);
/*Alocar espaço*/
matrix = (COMPLEXO **) malloc(sizeof(dim) * sizeof(COMPLEXO));
/*Alocar linhas*/
for(i = 0; i < dim; i++){
matrix[i] = (COMPLEXO *) malloc(sizeof(dim) * sizeof(COMPLEXO));
}
if(matrix == NULL){
printf("Erro");
return;
}
/* Escrever dados */
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
matrix[i][j].real = i;
matrix[i][j].img = j;
}
}
printf("#insert matrix - done\n\n");
/* Imprimir dados */
for(i=0;i<dim;i++){
for(j=0;j<dim;j++){
printf("%.f|%.f ", matrix[i][j].real, matrix[i][j].img);
}
printf("\n");
}
printf("#print matrix - done \n\n");
zeroIt(matrix, dim);
for(i=0;i<dim;i++){
free(matrix[i]);
}
free(matrix);
printf("#free pointer - done \n\n");
getchar();
return 0;
}
答案 0 :(得分:2)
您的第一个malloc应该使用sizeof(COMPLEXO*)
,而不是sizeof(COMPLEXO)
。你正在分配一个指针数组,而不是一个结构数组。
答案 1 :(得分:0)
你应该在malloc调用之后将NULL检查移动到正确的位置,这样你就可以在使用指针之前发现问题...(这不是你的错误,你必须拥有完整的RAM并交换到体验这个):
matrix = (COMPLEXO **) malloc(sizeof(dim) * sizeof(COMPLEXO));
if(matrix == NULL){
printf("Error");
return;
}
接下来要检查分配错误是否完成,你应该在for循环中添加check:
for(i = 0; i < dim; i++){
matrix[i] = (COMPLEXO *) malloc(sizeof(dim) * sizeof(COMPLEXO));
if(matrix[i]==NULL)
{
printf("Not enough memory");
return ;
}
}
然后你可以使用一些奇怪的大量DIM来测试它,比如2000000000
。
答案 2 :(得分:0)
简单的家伙,
matrix = (COMPLEXO **) malloc(dim * sizeof(COMPLEXO*));