Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用这个malloc语句分配内存?_C_Memory_Malloc_Allocation - Fatal编程技术网

如何使用这个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

我有一个读取文件的方法。一个更具体的矩阵,其中前两个数字是行和列。然而,当我尝试使用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;

}
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,则这完全是意料之中的事。