2013-05-11 5 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

Что такое 'rows' и' columns' ?? – yngccc

+0

У меня есть изменения на «столбцы» и «renglones». – Mike930494

+0

Также в этом случае float * res = (float *) malloc (rows * columns * sizeof (float)); но он не работает – Mike930494

ответ

3

Ваша проблема в том, что вы делаете:

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

В результате, эти 2 цифры (которые вы прочитали из файла) становятся указателями на renglones и columnas, которые вы дополнительно разыменовать для расчета размера для malloc. Например, если вы читаете цифры 16 и 32, то renglones указывает на 0x00000010 и columnas указывает на 0x00000020. Однако эти ячейки памяти, очевидно, содержат случайный мусор (с точки зрения вашей задачи), то есть они, вероятно, содержат произвольно огромные числа, которые при умножении вместе дают еще большее число, и malloc просто не может выделить столько объема памяти, что в конечном итоге приводит к в аварии.

Вместо этого он должен быть:

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

, так как renglones и columnas являются указателями уже. Таким образом, вы действительно заполнили бы две переменные int, на которые указывают renglones и columnas, и получите ожидаемое поведение.

Смежные вопросы