2013-05-11 63 views
0

我有這種讀取文件的方法。一個矩陣更具體,前兩個數字是行和列。但是,當我嘗試分配內存使用malloc和使用行和列的應用程序崩潰。如何使用此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

什麼是「行」和「列」? – yngccc 2013-05-11 00:13:24

+0

我已更改爲「columnas」和「renglones」。 – Mike930494 2013-05-11 00:18:12

+0

也以這種方式float * res =(float *)malloc(rows * columns * sizeof(float));但它不起作用 – Mike930494 2013-05-11 00:23:01

回答

3

你的問題是,你做的:

... 
fscanf(fp,"%d",&renglones); 
... 
fscanf(fp,"%d",&columnas); 
... 

其結果是,那些2個數字(您從文件中讀取)成爲指向renglonescolumnas您進一步提領來計算大小malloc。例如,如果您閱讀數字1632,則renglones指向0x00000010columnas指向0x00000020。但是,這些存儲器單元顯然包含隨機垃圾(從任務角度來看),也就是說它們可能包含任意大的數字,這些數字在相乘時會產生更大的數字,並且不能分配太多的內存,最終導致內存不足在崩潰。

相反,它應該是:

... 
fscanf(fp,"%d",renglones); 
... 
fscanf(fp,"%d",columnas); 
... 

因爲兩者renglonescolumnas是指針了。通過這種方式,您將真正填充指向renglonescolumnas所指向的兩個int變量,並獲得預期的行爲。