0

ファイルを読み取るこのメソッドがあります。最初の 2 つの数値が行と列である、より具体的な行列。ただし、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;

}

ありがとう!

4

1 に答える 1

3

あなたの問題は、あなたがすることです:

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

その結果、これらの 2 つの数値 (ファイルから読み取ったもの) はポインターにrenglonesなり、columnasさらに逆参照して のサイズを計算しますmalloc。たとえば、数字16とを読み取ると32、と を指しrenglonesます。ただし、これらのメモリセルには明らかにランダムなガベージが含まれています (タスクの観点から)。つまり、それらはおそらく任意の巨大な数を含んでおり、掛け合わせるとさらに大きな数になり、それだけの量のメモリを割り当てることができず、最終的にはクラッシュ。0x00000010columnas0x00000020malloc

代わりに、次のようにする必要があります。

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

renglonesとの両方columnasがすでにポインターであるためです。このようにして、2 つのint変数 whichrenglonescolumnaspoint を実際に埋めて、期待される動作を得ることができます。

于 2013-05-11T00:27:19.763 に答える