如何使用这个malloc语句分配内存?
我有一个读取文件的方法。一个更具体的矩阵,其中前两个数字是行和列。然而,当我尝试使用malloc和使用行和列分配内存时,应用程序崩溃 我使用的代码如下:如何使用这个malloc语句分配内存?,c,memory,malloc,allocation,C,Memory,Malloc,Allocation,我有一个读取文件的方法。一个更具体的矩阵,其中前两个数字是行和列。然而,当我尝试使用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",&rengl
#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;
}
float*readFile(char*nombre,int*renglones,int*columnas){
文件*fp;
fp=fopen(名称为“r”);
fscanf(fp,“%d”,伦格隆);
printf(“伦格朗斯的数字是%d\n”,伦格朗斯);
fscanf(fp,“%d”,列);
printf(“列的编号为%d\n”,列);
浮动值;
float*res=(float*)malloc(*renglones**columns*sizeof(float));//记忆保留
printf(“llegue a malloc\n”);
int i;
对于(i=0;i而言,您的问题在于:
...
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
都已经是指针了。这样,您就可以真正填充renglones
和columnas
指向的两个int
变量,并获得预期的行为。您的问题在于:
...
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
都已经是指针了。这样,您就可以真正填充renglones
和columnas
指向的两个int
变量,并获得预期的行为。什么是rows
和columns
?我已经更改为“columnas”和“renglones”。同样,以这种方式,float*res=(float*)malloc(rowscolumnsizeof(float));但使用(*renglones)*(*columnas)它不起作用*sizeof…
改变了什么?一个显而易见且唯一相关的问题是:您传递给malloc的实际数字是多少?您应该做的第一件事是在malloc调用之前计算并打印该数字,以查看您传递的是什么。如果您尝试分配负数或分配50 GB,则ilure完全是意料之中的。什么是行
和列
?我必须更改为“columnas”和“renglones”。同样,通过这种方式,float*res=(float*)malloc(rowscolumnsizeof(float));但它在使用(*renglones)*(*columnas)时不起作用*sizeof…
改变了什么?一个显而易见且唯一相关的问题是:您传递给malloc的实际数字是多少?您应该做的第一件事是在malloc调用之前计算并打印该数字,以查看您传递的是什么。如果您尝试分配负数或分配50 GB,则这完全是意料之中的事。