我有这个读取文件的方法。矩阵更具体,前两个数字是行和列。但是,当我尝试使用malloc分配内存并使用行和列时应用程序崩溃。
我正在使用的代码是这一个:
#include stdio.h
#include stdlib.h
#include stdlib.h
float * readFile(char* nombre, int*renglones, int*columnas){
FILE *fp;
fp=fopen(nombre,"r");
fscanf(fp,"%d",&renglones);
printf("el numero de renglones es %d\n",renglones);
fscanf(fp,"%d",&columnas);
printf("number of rows %d\n",columnas);
float value;
fscanf(fp,"%f",&value);
printf("el numero de columnas es %f\n",value);
fscanf(fp,"%f",&value);
printf("el numero de columnas es %f\n",value);
printf("no llegue a malloc");
float * res = malloc(*renglones**columnas*sizeof(float)); //memory reservation and the line that breaks the program
printf("after malloc");
fclose(fp);
return 0;
}
我知道包含在<>之间
最终代码是包含以下内容的代码:stdio.h和stdlib.h
float * readFile(char* nombre, int*renglones, int*columnas){
FILE *fp;
fp=fopen(nombre,"r");
fscanf(fp,"%d",renglones);
printf("el numero de renglones es %d\n",renglones);
fscanf(fp,"%d",columnas);
printf("el numero de columnas es %d\n",columnas);
float value;
float * res = (float*)malloc(*renglones**columnas*sizeof(float)); //Reserva de memoria
printf("llegue a malloc\n");
int i;
for(i=0;i<*renglones**columnas;i++){
fscanf(fp, "%f",&value);
res[i]=value;
printf("dato %f\n",value);
}
printf("%d",i);
fclose(fp);
return res;
}
谢谢!
答案 0 :(得分:3)
你的问题是:
...
fscanf(fp,"%d",&renglones);
...
fscanf(fp,"%d",&columnas);
...
因此,这两个数字(您从文件中读取的数字)成为指向renglones
和columnas
的指针,您可以进一步取消引用以计算malloc
的大小。例如,如果您读取数字16
和32
,则renglones
指向0x00000010
,columnas
指向0x00000020
。然而,这些内存单元显然包含随机垃圾(从你的任务的角度来看),即它们可能包含任意大数,当它们相乘时会给出更大的数字,而malloc
根本无法分配那么多的内存,最终导致崩溃。
相反它应该是:
...
fscanf(fp,"%d",renglones);
...
fscanf(fp,"%d",columnas);
...
因为renglones
和columnas
都已成为指针。这样,您就可以填充int
和renglones
指向的两个columnas
变量,并获得预期的行为。